通过替换JTabbedPane中的另一个JPanel来更新JPanel

时间:2014-06-10 22:51:43

标签: java swing netbeans jpanel

我正在使用NetBeans GUI为我的应用程序开发图形界面。 总之,我在JFrame中有一个JTabbedPane,简单描述为:

public class MyApplication extends JFrame(){


    private JTabbedPane tabbedpanel_tasks;
    private JPanel jpanel_father;

    ...

    // Settings of JTabbedPane

    tabbedpanel_tasks = new JTabbedPane();

    tabbedpanel_tasks.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);

    tabbedpanel_tasks.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

    jpanel_father = new JPanel();

    ...

}

我有一个特定的JPanel - 我将调用jpanel_father - 这是组成JTabbedPane的几个JPanel之一:

public class MyApplication extends JFrame(){

    ...
    // Initializing a new JPanel and inserting into JTabbedPane

    jpanel_father = new JPanel();
    tabbedpanel_tasks.addTab("Father tab", jpanel_father);

    ...

}

查看jpanel_father,有一个JComboBox(组合框)和一个JPanel(jpanel_generic),它应该假设一个特定的JPanel扩展类,创建为NetBeans的JPanel形式。组合框存储2个值,这意味着当我选择其中一个时,关联的JPanel将出现在jpanel_generic的位置(显示在下面的代码中):

public class MyApplication extends JFrame(){

    private JComboBox combobox;
    private JPanel jpanel_generic;
    private JPanelSon1 jpanel_son1;
    private JPanelSon2 jpanel_son2;

    ...

    // Code block for constructing jpanel_father
    combobox = new JComboBox(new String[] { "JPanel 1", "JPanel 2" });
    jpanel_generic = new JPanel();
    jpanel_son1 = new JPanelSon1();
    jpanel_son2 = new JPanelSon2();

    combobox.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

            int option = combobox.getSelectedIndex();

            setCurrentGenericPanel(option);

        }
});

    jpanel_father.add(combobox);
    jpanel_father.add(jpanel_generic);
    jpanel_father.setSize(300,300);
    jpanel_father.setVisible(true);
}

public void setCurrentGenericPanel(int option){

    jpanel_generic.removeAll();

    if(option == 0)
       jpanel_generic = jpanel_son1;
    else
       jpanel_generic = jpanel_son2;

    jpanel_generic.validate();
    jpanel_generic.repaint();

}


public class JPanelSon1 extends JPanel {

    private JLabel labelson1;

    public JPanelSon1(){

        labelson1 = new JLabel("This is JPanel Son 1");
        add(labelson1);
        this.setSize(300,300);
        this.setVisible(true);
    }

}

public class JPanelSon2 extends JPanel {

    private JLabel labelson2;

    public JPanelSon2(){

        labelson2 = new JLabel("This is JPanel Son 2");
        add(labelson2);
        this.setSize(300,300);
        this.setVisible(true);

    }

}

但是,当我在组合框上选择一个值时,没有任何反应。我的意思是...... panel_generic没有使用相应的正确JPanel进行更新。我的代码可能有什么问题?我为省略诸如进口,中间代码等细节而道歉。

谢谢!

1 个答案:

答案 0 :(得分:3)

此代码:

public void setCurrentGenericPanel(int option){    
    jpanel_generic.removeAll();    
    if(option == 0)
       jpanel_generic = jpanel_son1;
    else
       jpanel_generic = jpanel_son2;

    jpanel_generic.validate();
    jpanel_generic.repaint();

}

使用jpanel_generic.removeAll();方法调用,您将使用removalAll()方法从通用JPanel中删除所有 组件。您没有从其容器中删除jpanel_generic JPanel,我认为这是您通过此调用的目标。

此外,更改jpanel_generic变量引用的变量不会交换GUI中显示的对象。这个问题归结为对象是什么和变量是什么之间的巨大差异。要执行您尝试手动执行的操作,您将从JPanel容器中删除保存 jpanel_generic JPanel的所有组件,然后将新组件添加到同一容器中,然后重新验证并重新绘制该组件的容器即可。

但是,我提出了一个更简单的解决方案,即容器JPanel使用CardLayout,并使用该布局来交换JPanels,而不是搞乱所有这些。 Google Java CardLayout Tutorial。谷歌首先打击血腥细节。