2

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

}
4

3 回答 3

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,而是其他问题。

于 2013-10-01T15:33:47.740 回答
1

好的,第二次来了。现在您已经完成了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);
        }
    }

}

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

希望这可以帮助。

于 2013-10-01T20:43:52.987 回答
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:我认为您正在尝试将panel1andpanel2为选项卡,但您使用的是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):

在此处输入图像描述

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

于 2013-10-01T15:35:13.180 回答