使用带有JTabbedpane的外部JPanel时遇到问题

时间:2014-08-07 12:27:58

标签: java user-interface jpanel jtabbedpane

我正在学习在学校创建GUI。我已经制作了这两个独立的JPanel。我试图创建一个标签窗格,添加包括在seeparate选项卡中的每一个。当我打开运行代码时,我得到三个单独的窗口。一个是带有2个空白标签的窗口。其他2个窗口是我想要在每个选项卡中的面板。有人可以帮助我。

    package Week4;

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

public class TabP2 {

    private JFrame ourFrame = new JFrame("Week 4");
    private JTabbedPane ourTabbedPane;
    private JPanel masterContainer, tab1, tab2;

    TabP2(){

        masterContainer = (JPanel) ourFrame.getContentPane();

        masterContainer.setLayout(new BorderLayout());

        ourTabbedPane = new JTabbedPane();

        tab1 = new OfficeAreaCalculator();

        tab2 = new DayGUI();

        ourTabbedPane.addTab("Office Area Calculator", tab1);
        ourTabbedPane.addTab("DayGUI", tab2);

        masterContainer.add(ourTabbedPane, BorderLayout.CENTER);

        ourFrame.pack();
        ourFrame.setVisible(true);
        ourFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {

public void run() {
    new TabP2();
}
});
    }
}

package Week4;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import java.awt.*;


public class DayGUI2 extends JPanel{

    private JButton cmdGood;
    private JButton cmdBad;

    public DayGUI2(){       

        cmdGood = new JButton("Good");
        cmdBad = new JButton("Bad");        

        setBackground(Color.white);

        add(cmdGood);
        cmdGood.setBackground(Color.green);
        add(cmdBad);
        cmdBad.setBackground(Color.red);

        cmdGood.setMnemonic('G');
        cmdBad.setMnemonic('B');

        ButtonsHandler bhandler = new ButtonsHandler();
        cmdGood.addActionListener(bhandler);
        cmdBad.addActionListener(bhandler);

        setVisible(true);
    }

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

        }
    }

    public static void main(String[] args) {
    }

}

我会添加另一个,但我没有看到需要。它的设置几乎相同。

提前致谢!

2 个答案:

答案 0 :(得分:0)

首先,通过JTabbedPane方法将您的面板添加到addTab标签,而不是add方法。

检查this链接和THIS教程

    ourTabbedPane.addTab("Office Area Calculator", tab1);
    ourTabbedPane.addTab("DayGUI", tab2);

答案 1 :(得分:0)

除了删除不必要的主要方法,所以你只有一个,这里有一些指针。

您不需要实例化新面板来放置面板,以便将它们作为标签。

tab1 = new JPanel();
OfficeAreaCalculator OAC = new OfficeAreaCalculator();
tab1.add(OAC);

tab2 = new JPanel();
DayGUI Day = new DayGUI();
tab1.add(Day);

ourTabbedPane.addTab("Office Area Calculator", tab1);
ourTabbedPane.addTab("DayGUI", tab2);

正如您在问题中指出的那样,这些类已经扩展JPanel,因此只需将它们实例化并将它们添加为标签。

tab1 = new OfficeAreaCalculator();

tab2 = new DayGUI();

ourTabbedPane.addTab("Office Area Calculator", tab1);
ourTabbedPane.addTab("DayGUI", tab2);

在致电setVisible(true)之前,您可能需要致电pack(),以便在展示时正确调整框架尺寸。

ourFrame.pack();
ourFrame.setVisible(true);
ourFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

此外,在java中使用Swing构建GUI时,始终将GUI代码委托给Event Dispatch Thread(EDT)以避免线程问题。 Swing在它自己的线程中运行 - EDT - 与你的主线程不同。您当前正在从主线程调用Swing代码,这是一个坏主意,所以请改为:

SwingUtilities.invokeLater(new Runnable() {

    public void run() {
        new TabP2();
    }
});