有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

}

共 (3) 个答案

  1. # 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);
            
        }
    } 
    

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

    enter image description here

    如果在代码中重复相同的过程,但仍然有错误,那么问题不在于JTabbedPane,而在于其他方面

  2. # 2 楼答案

    好了,再来一次。现在你有了DayGui类,我们注意到你试图在初始化它之前使用dayPanel。i、 e.你哪儿也不说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);
            }
        }
    
    }
    

    那么这些有什么不同呢?基本上,我已经移除了你的NullPointerException你进入DayGui。我所做的任何其他更改都是为了避免代码混乱,这样您才真正了解代码中发生了什么

    希望这有帮助

  3. # 3 楼答案

    When I run it, both JPanels open, but the JTabbedPane does not. I get a lot of Unknown Source errors.

    根据你的代码和导入部分:

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

    jtabbedpaneasignment:我认为您试图添加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):

    enter image description here

    希望这对您有所帮助,并对延期表示歉意