我目前正在使用Netbeans GUI构建器创建一个java swing GUI。我有一堆面板正在我的主JFrame上被替换,因为用户导航GUI并且控制器类正在处理这个问题。但是,有一个步骤(FilterDefinitionPanel)包含一个组合框以及一个空白内部面板(QueryHelperPanel)。
我想要做的是将这个内部面板换成我创建的另一个(StringQueryDefinitionPanel),具体取决于用户在组合框中选择的内容。现在,在我的组合框的ComboBoxItemStateChanged事件处理程序下,我的控制器类运行此方法:
public void selectFilterAttribute(Object item) {
/**
* Determine panel to create based on item selection. Currently always returns the same
* StringQueryDefinitionPanel.
*/
JPanel panel = this.getRequiredQueryHelperPanel(item);
/**
* Swap the placeholder QueryHelperPanel with the required one.
*/
((FilterDefinitionPanel) this.mainFrame.getMainPanel()).setQueryHelperPanel(panel);
/**
* Not sure if all of these are needed :\
*/
mainFrame.validate();
mainFrame.repaint();
mainFrame.pack();
}
这就是FilterDefinitionPanel的setQueryHelper方法中发生的事情:
public void setQueryHelperPanel(JPanel panel){
this.remove(queryHelperPanel);
this.queryHelperPanel=panel;
this.queryHelperPanel.repaint();
/**
* Again, not sure which refresh methods are needed...
*/
this.validate();
this.repaint();
}
目前我认为这正在取代我的内部占位符面板......某些东西......但替代品似乎什么都没有。我不知道它是否重要但占位符和替换面板的大小相同。我是一个摇摆小块,所以任何提示都会非常感激。
答案 0 :(得分:7)
setQueryHelperPanel()
方法不起作用,因为它通过this
方法从remove()
的子集合中删除现有面板,但之后不使用add()
添加新面板 - 将其分配给实例变量不会导致它成为子项。
但是,对您的问题更清晰的解决方案是使用CardLayout。
答案 1 :(得分:0)
感谢您的回复。
我之前看过CardLayout,但是我试图避免它,因为据我所知,它加载了内存中的所有面板,然后允许你将它们交换掉。我想在动态显示面板时完全控制。
忘记删除是我的一个愚蠢的错误。我实际上早些时候有,但它仍然无法正常工作。这是当前的交换方法:
public void setQueryHelperPanel(JPanel panel){
this.remove(queryHelperPanel);
this.queryHelperPanel=panel;
this.add(queryHelperPanel);
this.queryHelperPanel.repaint();
this.validate();
this.repaint();
}
我知道设置实例变量实际上并不是将它作为子项添加,但我的想法是该变量将用于记住要删除或添加的面板。