Java 未将JPanel添加到JTabbedPane
对于我的家庭作业额外学分,我创建了一个JTabbedPane并添加了两个jpanel。我觉得我很接近,但它仍然没有编译。当我运行它时,两个JPanel都会打开,但JTabbedPane不会打开。我得到了很多未知源错误。我怀疑在这一点上,我的问题在JPanels本身,因为它们最初是JFrames,我尝试(我认为没有成功)将JFrames转换为JPanels JTabbedPaneAssignment应该创建JTabbedPane,并使用一个选项卡上的apps DayGui和另一个选项卡上的OfficeAreaCalculator填充这两个窗格。这里我只包括jtabbedpaneasignment和DayGui类。我道歉,如果它太多的代码,我已经修剪了很多我认为无关的,但可能仍然有太多。 下面是调用类jtabbedpaneasignmentJava 未将JPanel添加到JTabbedPane,java,swing,jpanel,jtabbedpane,Java,Swing,Jpanel,Jtabbedpane,对于我的家庭作业额外学分,我创建了一个JTabbedPane并添加了两个jpanel。我觉得我很接近,但它仍然没有编译。当我运行它时,两个JPanel都会打开,但JTabbedPane不会打开。我得到了很多未知源错误。我怀疑在这一点上,我的问题在JPanels本身,因为它们最初是JFrames,我尝试(我认为没有成功)将JFrames转换为JPanels JTabbedPaneAssignment应该创建JTabbedPane,并使用一个选项卡上的apps DayGui和另一个选项卡上的Offi
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);
}
}
}
你的问题一直模棱两可,你发布的代码比这里的任何人都要多 我为您制作了一个非常小但有效的
JTabbedPane
示例,让您看到使其工作所需的最小工作量
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
public class JTabbedPaneExample extends JFrame{
public JTabbedPaneExample(String title){
super(title);
setSize(800,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JTabbedPane tabbedPane = new JTabbedPane();
JPanel panelOne = new JPanel();
JPanel panelTwo = new JPanel();
tabbedPane.add(panelOne,"First panel");
tabbedPane.add(panelTwo,"Second panel");
add(tabbedPane);
}
public static void main(String[] args){
new JTabbedPaneExample("JTP Example").setVisible(true);
}
}
然后运行时,此代码如下所示:
如果在代码中重复相同的过程,但仍然存在错误,那么问题不在于JTabbedPane
,而在于其他方面
当我运行它时,两个JPanel都会打开,但JTabbedPane不会打开。我明白了
许多未知源错误
那么,根据您的代码和导入部分:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
这些行不会编译(除非DayGUI
和OfficeAreaCalculator
类与jtabbedpaneasignment
类位于同一个包中):
这是我在编译和运行您的示例时遇到的唯一错误。我改了以下几行:
tabbedPane.addTab( "DayGui", new JPanel());
tabbedPane.addTab("Office Calculator", new JPanel());
它就像一个符咒
更新
根据您最近的编辑(添加DayGui
类,谢谢),您的代码中有几个错误
DayGui:该类扩展了JPanel
,因此您需要直接在此类上添加组件,而不需要此面板:
private JPanel dayPanel;
您需要直接在DayGui
类上设置布局管理器、按钮和背景,如下所示:
public DayGui() {
cmdGood = new JButton("Good");
cmdBad = new JButton("Bad");
setLayout(new FlowLayout());
add(cmdGood);
add(cmdBad);
setSize(300, 150);
ButtonsHandler bhandler = new ButtonsHandler();
cmdGood.addActionListener(bhandler);
cmdBad.addActionListener(bhandler);
setBackground(Color.CYAN);
}
jtabbedpaneasignment:我认为您试图将panel1
和panel2
添加为选项卡,但您使用add
方法代替addTab
:
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
tabbedPane.add(panel1,"First panel");
tabbedPane.add(panel2,"Second panel");
此外,这一行:
tabbedPane.addTab("DayGui", panel1);
应该是:
tabbedPane.addTab("DayGui", pnlDay);
最后,在这一行中,您第二次添加了panel2
,这是不正确的:
tabbedPane.addTab("OfficeAreaCalculator", panel2); //I'd comment this line
如果你做出建议性的改变,你会看到类似这样的东西(顺便说一句,青色几乎让我失明:p):
希望这会对您有所帮助,并为您的延期表示歉意。好的,这是第二次。现在您已经拥有了
DayGui
类,我们注意到您在初始化它之前尝试使用dayPanel
。i、 e.你怎么也不说dayPanel=newjpanel()代码>。这导致在代码中抛出NullPointerException
,破坏了正常的执行过程。修复此问题,您的DayGui
类将在运行时正常运行
在您的代码库中,您还可以做一些非常有趣的事情,即开始使用某些东西,但永远都不会去完成它。例如,您扩展了JPanel
,但使用了JPanel
类型的成员变量来完成其余的工作。建议将实例变量全部废弃,并使用从扩展JPanel
继承的方法
现在让我们进入您的jtabbedpaneasignment
类。虽然不可怕,但代码可读性不强,并且在许多地方重复(多次添加选项卡面板)。如果要将此代码进一步应用到更大的项目中,维护和调试将很快成为一个问题
为了向您展示代码中的混乱程度,我已经快速地将您提供的代码重写为可编译的,并且应该大致完成您正在进行的工作
jtabbedpaneasignment
:
DayGui-重命名为DayPanel
:
那么这些有什么不同呢?基本上,我已经删除了您进入的DayGui
中的NullPointerException
。我所做的任何其他更改都是为了避免代码混乱,这样您才能真正了解代码中发生了什么
希望这有帮助。我道歉。我不确定要包含多少代码。我确实看到了与您显示的类似的JTabbedPane。问题是DayGui和OfficeAreaCalculator不显示在选项卡式窗格中。它们确实会在选项卡式窗格外弹出,当我退出jtabbedpane时,它们会成功退出。我恐怕在代码中看不到任何提示您行为的内容。您能否定义DayGUI等,并且只显示与您所谈论的内容相关的代码。我们不知道你指的是第一类还是第二类。我更新了上面的代码。我不知道问题是在第一个类jtabbedpaneasignment(创建JTabbedPane的ans应该填充窗格)中,还是在JPane类DayGui中。在我看来,DayGui是罪魁祸首,特别是因为我正在尝试将它从JFrame转换为JLabel。谢谢。我会研究这个。我知道我的代码乱七八糟。这是我在头部爆炸时尝试50种不同东西的结果,就像在电影扫描仪中;)
tabbedPane.addTab("OfficeAreaCalculator", panel2); //I'd comment this line
import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
public class JTabbedPaneAssignment extends JPanel
{
public JTabbedPaneAssignment()
{
final JTabbedPane tabbedPane = new JTabbedPane();
final DayPanel dayPanel = new DayPanel();
final JPanel officePanel = new JPanel();
tabbedPane.add("DayGui", dayPanel);
tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);
tabbedPane.add("OfficeAreaCalculator", officePanel);
tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);
add(tabbedPane);
}
// 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);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
createAndShowGUI();
}
});
}
}
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class DayPanel extends JPanel {
public DayPanel() {
super();
setBackground(Color.CYAN);
final JButton goodButton = new JButton("Good");
final JButton badButton = new JButton("Bad");
ActionListener listener = new DayPanel.ButtonsHandler();
goodButton.addActionListener(listener);
badButton.addActionListener(listener);
add(goodButton);
add(badButton);
}
class ButtonsHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
final String command = ((JButton) e.getSource()).getActionCommand();
if (command.equals("Good")) {
showMessage("Today is a good day!");
} else if (command.equals("Bad")) {
showMessage("Today is a bad day!");
}
}
// Show popup message
private void showMessage(String message) {
JOptionPane.showMessageDialog(null, message,
"Event Handler Message", JOptionPane.INFORMATION_MESSAGE);
}
}
}