Java Swing-JTabbedPane-两个选项卡都不显示面板
为什么在第一个选项卡上不显示southPanel?只在第二个选项卡上显示 如果我为每个选项卡调用southPanel(),是的-southPanel会显示,但是监听器不工作(我认为这是由于使用新的内存地址两次分配gui对象,例如按钮) 因此,无论我做什么,都有一个问题——要么southpanel不显示,要么it显示,但回调根本不起作用,对于第一个选项卡 有什么解决办法吗Java Swing-JTabbedPane-两个选项卡都不显示面板,java,swing,jpanel,jtabbedpane,Java,Swing,Jpanel,Jtabbedpane,为什么在第一个选项卡上不显示southPanel?只在第二个选项卡上显示 如果我为每个选项卡调用southPanel(),是的-southPanel会显示,但是监听器不工作(我认为这是由于使用新的内存地址两次分配gui对象,例如按钮) 因此,无论我做什么,都有一个问题——要么southpanel不显示,要么it显示,但回调根本不起作用,对于第一个选项卡 有什么解决办法吗 import java.awt.*; import java.awt.event.*; import javax.swi
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyApp extends JFrame implements ActionListener, ItemListener {
private JTabbedPane pane;
private JPanel tab1Panel, tab2Panel, centerPanel, southPanel, inputPanel, checkPanel;;
private JScrollPane scrollPane1, scrollPane2, scrollPane3;
private JTextArea area1, area2;
private JButton quit, ok;
private JCheckBox check;
private JTextField input;
private JLabel input_lbl, check_lbl;
public static void main(String[] args) {
new MyApp().setVisible(true);
}
public MyApp() {
initComp();
setListeners();
}
private void initComp() {
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
setSize(dim.width / 2, dim.height / 2);
setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2);
southPanel();
tab1();
tab2();
pane = new JTabbedPane();
pane.addTab("info om xml", tab1Panel);
pane.addTab("rita", tab2Panel);
Container contentPane = getContentPane();
contentPane.add(pane);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void tab1() {
area1 = new JTextArea();
area2 = new JTextArea();
scrollPane1 = new JScrollPane(area1, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane2 = new JScrollPane(area2, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
centerPanel = new JPanel(new GridLayout(1, 2));
centerPanel.add(scrollPane1);
centerPanel.add(scrollPane2);
tab1Panel = new JPanel(new BorderLayout());
tab1Panel.add(centerPanel, BorderLayout.CENTER);
tab1Panel.add(southPanel, BorderLayout.SOUTH);
}
private void tab2() {
centerPanel = new JPanel();
centerPanel.add(new JLabel("this is for drawing"));
tab2Panel = new JPanel(new BorderLayout());
tab2Panel.add(centerPanel, BorderLayout.CENTER);
tab2Panel.add(southPanel, BorderLayout.SOUTH);
}
private void southPanel() {
ok = new JButton("Ok");
quit = new JButton("Avsluta");
check_lbl = new JLabel("Change");
input_lbl = new JLabel("Document");
input = new JTextField("");
input.setEditable(false);
check = new JCheckBox();
inputPanel = new JPanel(new BorderLayout());
inputPanel.add(input_lbl, BorderLayout.WEST);
inputPanel.add(input, BorderLayout.CENTER);
checkPanel = new JPanel(new BorderLayout());
checkPanel.add(check_lbl, BorderLayout.WEST);
checkPanel.add(check, BorderLayout.CENTER);
southPanel = new JPanel(new GridLayout(1, 4));
southPanel.add(quit);
southPanel.add(ok);
southPanel.add(inputPanel);
southPanel.add(checkPanel);
}
@Override
public void actionPerformed(ActionEvent aE) {
String theEvent = aE.getActionCommand();
if (theEvent.equals("Avsluta")) {
System.exit(0);
} else if (theEvent.equals("Ok")) {
System.out.println("ok!");
}
}
@Override
public void itemStateChanged(ItemEvent iE) {
if (iE.getStateChange() == iE.SELECTED) {
input.setEditable(true);
} else {
input.setEditable(false);
}
}
private void setListeners() {
check.addItemListener(this);
ok.addActionListener(this);
quit.addActionListener(this);
}
}
编辑:也许我应该用另一种方式来回答这个问题-
如何使这两个选项卡共享同一个southPanel
如何使这两个选项卡共享同一个southPanel
简而言之,你不能。组件只能驻留在单个容器中。您需要为每个选项卡创建两个不同的southPanel
实例
更好的解决方案是将组件分离为可重用的组件(即使southPanel
成为自己的组件),并在中包含功能。这样,您可以简单地重新创建它,甚至通过继承修改它的功能