【问题标题】:Having trouble using external JPanel with JTabbed pane在使用带有 JTabbed 窗格的外部 JPanel 时遇到问题
【发布时间】:2014-08-07 12:27:58
【问题描述】:

我正在学校学习创建 GUI。我已经制作了这两个独立的 JPanel。我正在尝试创建一个选项卡式窗格,其中添加了将这些窗格中的每一个都包含在单独的选项卡中。当我打开运行代码时,我得到三个单独的窗口。一个是带有 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) {
    }

}

我会添加另一个,但我认为没有必要。它的设置几乎相同。

提前致谢!

【问题讨论】:

  • 你有3个WINDOWS?使用最小化、最大化和关闭按钮 ?????????
  • 我没有足够的声望来发布截图
  • 我得到一个有两个标签的窗口。我得到另一个窗口,其中有 DayGUI 在其中工作,另一个窗口中有 OfficeAreaCalculator。
  • 您在哪个 IDE 中进行编程?
  • 日食。它是我们必须用于课堂的。我们不能使用类似 netbeans 的东西

标签: java user-interface jpanel jtabbedpane


【解决方案1】:

除了去掉不必要的main方法,让你只有一个,这里给你一些指点。

您无需实例化新面板即可将面板放入其中以将它们用作选项卡。

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 代码委托给事件调度线程 (EDT) 以避免线程问题。 Swing 在它自己的线程中运行 - EDT - 这与您的主线程不同。您当前正在从您的主线程调用 Swing 代码,这是一个坏主意,因此请改为:

SwingUtilities.invokeLater(new Runnable() {

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

【讨论】:

  • 我理解你所说的一切,除了线程部分。我在google上查了一下,还是有点乱。内容仍在单独的窗口中打开。到目前为止,感谢您对此提供的帮助。
  • 没关系,它有效。我花了一个小时才意识到我犯了一个错误。我用 2 命名了所有类,因为我不想弄乱我原来的工作。但是在一遍又一遍地编辑之后,我打电话给原来的班级,这是错误的。你是最好的。谢谢!
  • 您可以在tutorial 中阅读更多关于 Swing 线程的信息。
【解决方案2】:

首先,通过addTab 方法而不是add 方法将您的面板作为选项卡添加到JTabbedPane

查看this链接和THIS教程

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

【讨论】:

  • 我遇到的问题是获取要填充到选项卡中的信息。我试过了,但我仍然无法让它工作 ourTabbedPane.addTab(null, tab1); ourTabbedPane.setTabComponentAt(0, new JLabel("Office Area Calculator"));
  • 截图怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
相关资源
最近更新 更多