为了我的功课额外功劳,我正在创建一个JTabbedPane并添加两个Jpanel。我觉得我很亲密,但它仍然无法编译。当我运行它时,两个JPanel都打开,但JTabbedPane没有。我收到很多未知来源错误。我怀疑此时我在JPanels中的问题是因为他们开始使用JFrames而且我已经尝试过(我认为没有成功)将JFrame转换为JPanels。
JTabbedPaneAssignment应该创建JTabbedPane,并在一个选项卡上填充应用程序DayGui的两个窗格,在另一个选项卡上填充OfficeAreaCalculator。我这里只包括JTabbedPaneAssignment和DayGui类。如果代码太多,我很抱歉,我已经删除了很多我认为无关的内容,但可能仍然有太多。
这是调用类JTabbedPaneAssignment
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();
}
});
}
}
这是DayGui课程。它最初是作为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);
}
}
}
答案 0 :(得分:3)
你对自己的问题一直很模糊,而且你发布的代码比任何人都有时间浏览的代码要多。
我已经制作了一个非常小但正常工作的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
,而在于其他问题。
答案 1 :(得分:1)
当我运行它时,两个JPanel都打开,但JTabbedPane没有。我明白了 很多未知来源错误。
嗯,根据您的代码和导入部分:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
这些行不会编译(除非DayGUI
和OfficeAreaCalculator
类与JTabbedPaneAssignment
类在同一个包中):
DayGui pnlDay = new DayGui();
OfficeAreaCalculator pnlOffice = new OfficeAreaCalculator ();
这是我尝试编译和运行示例的唯一错误。我在下面改了一行:
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);
}
JTabbedPaneAssignment :我认为您尝试添加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
如果您进行了建议的更改,您会看到类似的内容(顺便说一下,CYAN颜色几乎让我失明:P):
希望这对我们有所帮助,对不起。
答案 2 :(得分:0)
好的,这是第二次。现在您已经开始DayGui
课了,我们注意到您在初始化之前尝试使用dayPanel
。即你在哪里说dayPanel = new JPanel();
。这导致代码中出现NullPointerException
,搞砸了正常的执行过程。修复此问题,您的DayGui
类在运行时运行良好。
在您的代码库中,您还会做一些非常时髦的事情,即开始使用某些东西,但从未到处完成它。这方面的一个示例是您扩展JPanel
,但是使用类型为JPanel
的成员变量来完成剩余的工作。建议一起废弃实例变量,并使用您从扩展JPanel
继承的方法。
现在让我们进入你的JTabbedPaneAssignment
课程。虽然并不可怕,但代码不是很易读,而且它在许多地方重复出现(多次添加tabbedpanel)。如果您将此代码进一步放入更大的项目中,维护和调试很快就会成为一个问题。
为了向您显示您的代码中存在多少混乱,我很快就重写了您提供的代码以便编译,并且应该粗略地完成您正在处理的工作。
JTabbedPaneAssignment
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();
}
});
}
}
DayGui - renamed as DayPanel
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);
}
}
}
那么这些有什么不同?基本上,我已删除您NullPointerException
中的DayGui
。我所做的任何其他更改都是出于您的意图,而不是让您的代码完全免费,因此您真的知道您的代码中发生了什么。
希望这有帮助。