簡體   English   中英

使用帶有JTabbed窗格的外部JPanel遇到麻煩

[英]Having trouble using external JPanel with JTabbed pane

我正在學習在學校創建GUI。 我已經制作了這兩個單獨的JPanels。 我試圖創建一個選項卡式窗格,該窗格添加了在透明選項卡中包含的每個選項。 當我打開運行代碼時,我得到三個單獨的窗口。 一個是帶有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) {
    }

}

我會添加另一個,但我認為沒有必要。 其設置幾乎相同。

提前致謝!

首先,通過addTab方法(不使用add方法)將面板作為選項卡添加到JTabbedPane

檢查鏈接和教程

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

除了刪除不必要的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();
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM