我正在使用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进行更新。我的代码可能有什么问题?我为省略诸如进口,中间代码等细节而道歉。
谢谢!
答案 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
。谷歌首先打击血腥细节。