【问题标题】:JPanels not added to JTabbedPaneJPanels 未添加到 JTabbedPane
【发布时间】:2013-10-01 15:04:37
【问题描述】:

对于我的作业额外功劳,我正在创建一个 JTabbedPane 并添加两个 Jpanel。我觉得我很接近,但它仍然无法编译。当我运行它时,两个 JPanel 都打开了,但 JTabbedPane 没有。我收到很多未知来源错误。我怀疑此时我的问题在于 JPanel 本身,因为它们开始是 JFrame,我尝试(我认为不成功)将 JFrame 转换为 JPanel。

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);
        }
    }

}

【问题讨论】:

    标签: java swing jpanel jtabbedpane


    【解决方案1】:

    你的问题很模棱两可,而且你发布的代码比这里任何人都有时间浏览的要多。

    我制作了一个非常小但有效的 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,而是其他问题。

    【讨论】:

    • 我很抱歉。我不确定要包含多少代码。我确实看到 JTabbedPane 类似于您显示的内容。问题是 DayGui 和 OfficeAreaCalculator 不显示在选项卡式窗格中。它们确实会在选项卡式窗格之外弹出,并且当我退出 JTabbedPane 时它​​们会成功退出
    • 恐怕我在代码中看不到任何暗示你的行为的东西。您能否定义 DayGUI 等,并且只显示与您正在谈论的内容相关的代码。我们不知道您指的是第一类还是第二类。
    • 我更新了上面的代码。我不知道问题是在第一类 JTabbedPaneAssignment (创建 JTabbedPane ans 应该填充窗格),还是在 JPane 类 DayGui 中。在我看来,DayGui 是罪魁祸首,尤其是因为我试图将它从 JFrame 转换为 JLabel。
    【解决方案2】:

    好的,这是第二次。现在您已经有了DayGui 类,我们注意到您在初始化之前尝试使用dayPanel。即你在哪里说dayPanel = new JPanel();。这导致在您的代码中抛出NullPointerException,从而破坏了您的正常执行过程。修复此问题,您的 DayGui 类将在运行时正常运行。

    在您的代码库中,您还做了一些非常时髦的事情,即开始使用某些东西,但从未抽出时间完成它。这方面的一个例子是您扩展JPanel,但使用JPanel 类型的成员变量来完成其余的工作。建议将实例变量全部废弃,并使用您从扩展 JPanel 继承的方法。

    现在让我们进入您的JTabbedPaneAssignment 课程。虽然并不可怕,但代码的可读性并不高,并且在许多地方重复出现(多次添加您的选项卡式面板)。如果你将这段代码进一步应用到一个更大的项目中,维护和调试很快就会成为一个问题。

    为了向您展示您的代码有多少混乱,我已经快速重写了您提供的代码以使其可编译,并且应该大致完成您正在处理的工作。

    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);
            }
        }
    
    }
    

    那么这些有什么不同呢?基本上,我已经删除了你在DayGui 中的NullPointerException。我所做的任何其他更改都是为了让您的代码保持整洁,以便您真正了解代码中发生的情况。

    希望这会有所帮助。

    【讨论】:

    • 谢谢。我会研究这个。我知道我的代码一团糟。这是当我的脑袋爆炸时尝试 50 种不同事物的结果,就像电影 Scanners 中一样; )
    【解决方案3】:

    当我运行它时,两个 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;
    

    你需要直接在DayGuiclass上设置布局管理器、按钮和背景,像这样:

    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
    

    如果您进行建议的更改,您会看到类似这样的内容(顺便说一句,青色几乎让我失明:P):

    希望这对扩展有所帮助并抱歉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2013-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多