java JPanel未添加到JTabbedPane
对于我的家庭作业额外学分,我创建了一个JTabbedPane并添加了两个JPanel。我觉得我很接近,但它仍然无法编译。当我运行它时,两个JPanel都会打开,但JTabbedPane不会。我得到了很多未知源错误。我怀疑在这一点上,我的问题在于JPanel本身,因为它们最初是JFrames,我曾尝试(我认为没有成功)将JFrames转换为JPanel
JTabbedPaneAssignment应该创建JTabbedPane,并在两个窗格中填充一个选项卡上的apps DayGui和另一个选项卡上的OfficeAreaCalculator。我这里只包括JTabbedpaneasignment和DayGui类。我道歉,如果它太多的代码,我已经修剪了很多我认为无关的,但可能仍然有太多。
下面是调用类jtabbedpaneasignment
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class JTabbedPaneAssignment extends JPanel
{
public JTabbedPaneAssignment()
{
//super(new GridLayout(1, 1));
JTabbedPane tabbedPane = new JTabbedPane();
DayGui pnlDay = new DayGui();
OfficeAreaCalculator pnlOffice = new OfficeAreaCalculator ();
this.add(tabbedPane);
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
tabbedPane.add(panel1,"First panel");
tabbedPane.add(panel2,"Second panel");
//JComponent panel1 = makeTextPanel("Pane #1");
panel1.setPreferredSize(new Dimension(300, 150));
tabbedPane.addTab("DayGui", panel1);
tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);
//JComponent panel2 = makeTextPanel("Pane #2");
panel2.setPreferredSize(new Dimension(410, 50));
tabbedPane.addTab("OfficeAreaCalculator", panel2);
tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);
add(tabbedPane);
}
protected JComponent makeTextPanel(String text)
{
JPanel panel = new JPanel(false);
JLabel filler = new JLabel(text);
filler.setHorizontalAlignment(JLabel.CENTER);
panel.setLayout(new GridLayout(1, 1));
panel.add(filler);
return panel;
}
// Create JTabbedPane
private static void createAndShowGUI()
{
// Create and set up the window.
JFrame frame = new JFrame("JTabbedPane");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JTabbedPaneAssignment(), BorderLayout.CENTER);
JTabbedPane DayGui = new JTabbedPane();
JTabbedPane OfficeAreaCalculator = new JTabbedPane();
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}
这是大桂班。它最初是一个JFrame,但我正在尝试将其转换为JPanel。我想我的问题在这段代码中,但我不知道
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//public class DayGui extends JPanel
public class DayGui extends JPanel
{
private JPanel dayPanel;
private JButton cmdGood;
private JButton cmdBad;
public DayGui()
{
//dayPanel = new JPanel("Messages");
cmdGood = new JButton("Good");
cmdBad = new JButton("Bad");
Container c = dayPanel.getRootPane();
c.setLayout(new FlowLayout());
c.add(cmdGood);
c.add(cmdBad);
dayPanel.setSize(300, 150);
ButtonsHandler bhandler = new ButtonsHandler();
cmdGood.addActionListener(bhandler);
cmdBad.addActionListener(bhandler);
dayPanel.setVisible(true);
dayPanel.getRootPane().setBackground(Color.CYAN);
}
class ButtonsHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == cmdGood)
JOptionPane.showMessageDialog(null, "Today is a good day!",
"Event Handler Message",
JOptionPane.INFORMATION_MESSAGE);
if (e.getSource() == cmdBad)
JOptionPane.showMessageDialog(null, "Today is a bad day!",
"Event Handler Message",
JOptionPane.INFORMATION_MESSAGE);
}
}
}
# 1 楼答案
你的问题很含糊,你发布的代码比这里的任何人都要多
我做了一个很小但很有效的
JTabbedPane
示例,让您看到使其工作所需的最小工作量然后运行时,代码如下所示:
如果在代码中重复相同的过程,但仍然有错误,那么问题不在于
JTabbedPane
,而在于其他方面# 2 楼答案
好了,再来一次。现在你有了
DayGui
类,我们注意到你试图在初始化它之前使用dayPanel
。i、 e.你哪儿也不说dayPanel = new JPanel();
。这导致NullPointerException
被抛出到代码中,扰乱了正常的执行过程。解决这个问题,你的DayGui
类在运行时会运行良好在你的代码库中,你也会做一些非常有趣的事情,即开始使用一些东西,但永远都不会去完成它。一个例子是扩展
JPanel
,但使用类型为JPanel
的成员变量来完成其余的工作。建议将实例变量全部废弃,并使用从扩展JPanel
继承的方法现在让我们进入
JTabbedPaneAssignment
类。虽然不是很糟糕,但代码可读性不强,而且在很多地方都会重复(多次添加选项卡面板)。如果要将此代码进一步引入更大的项目,维护和调试很快就会成为一个问题为了向您展示代码中有多少杂乱无章的内容,我已经快速地将您提供的代码重写为可编译的,并且应该大致完成您正在进行的工作
JTabbedPaneAssignment
:DayGui - renamed as DayPanel
:那么这些有什么不同呢?基本上,我已经移除了你的
NullPointerException
你进入DayGui
。我所做的任何其他更改都是为了避免代码混乱,这样您才真正了解代码中发生了什么希望这有帮助
# 3 楼答案
根据你的代码和导入部分:
这些行不会编译(除非
DayGUI
和OfficeAreaCalculator
类与JTabbedPaneAssignment
类位于同一个包中):这是我试图编译并运行您的示例时遇到的唯一错误。我改了以下几行:
它就像一个符咒
更新
根据您最近的编辑(添加
DayGui
类,谢谢),您的代码中有几个错误DayGui:这个类扩展了
JPanel
所以你需要直接在这个类上添加你的组件,你不需要这个面板:您需要直接在
DayGui
类上设置布局管理器、按钮和背景,如下所示:jtabbedpaneasignment:我认为您试图添加
panel1
和panel2
作为选项卡,但您使用add
方法代替addTab
:还有这一行:
应该是:
最后,在这一行中,您第二次添加了
panel2
,这是不正确的:如果你做出建议性的改变,你会看到类似的情况(顺便说一句,青色几乎让我失明:p):
希望这对您有所帮助,并对延期表示歉意