Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing-JTabbedPane-两个选项卡都不显示面板_Java_Swing_Jpanel_Jtabbedpane - Fatal编程技术网

Java Swing-JTabbedPane-两个选项卡都不显示面板

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

为什么在第一个选项卡上不显示southPanel?只在第二个选项卡上显示

如果我为每个选项卡调用southPanel(),是的-southPanel会显示,但是监听器不工作(我认为这是由于使用新的内存地址两次分配gui对象,例如按钮)

因此,无论我做什么,都有一个问题——要么southpanel不显示,要么it显示,但回调根本不起作用,对于第一个选项卡

有什么解决办法吗

 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
成为自己的组件),并在中包含功能。这样,您可以简单地重新创建它,甚至通过继承修改它的功能