JPanel没有添加到JTabbedPane

时间:2013-10-01 15:04:38

标签: java swing jpanel jtabbedpane

为了我的功课额外功劳,我正在创建一个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);
        }
    }

}

3 个答案:

答案 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);

    }
} 

然后运行,此代码如下所示:

enter image description here

如果您在代码中重复相同的过程,但仍然遇到错误,则问题不在于您的JTabbedPane,而在于其他问题。

答案 1 :(得分:1)

  

当我运行它时,两个JPanel都打开,但JTabbedPane没有。我明白了   很多未知来源错误。

嗯,根据您的代码和导入部分:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

这些行不会编译(除非DayGUIOfficeAreaCalculator类与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 :我认为您尝试添加panel1panel2作为标签,但您使用的是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):

enter image description here

希望这对我们有所帮助,对不起。

答案 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。我所做的任何其他更改都是出于您的意图,而不是让您的代码完全免费,因此您真的知道您的代码中发生了什么。

希望这有帮助。