[英]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) {
}
}
我會添加另一個,但我認為沒有必要。 其設置幾乎相同。
提前致謝!
除了刪除不必要的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.