我目前正在用Netbeans GUI构建器制作java swing GUI。当用户浏览GUI并且控制器类正在处理这些事情时,我有一堆面板正在被我的主JFrame替换。然而,在一个步骤中,有一个面板(FilterDefinitionPanel)包含一个组合框以及一个空白的内部面板(QueryHelperPanel)。Swing:动态显示面板
我想要做的是将这个内部面板换成我创建的另一个(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();
}
目前,我认为这是代替我内部占位符面板与...东西...,但替换似乎没有包含任何内容。我不知道它是否重要,但占位符和替换面板的大小相同。我是一个摇摆结界,所以任何提示将非常感激。
你是否在Event Dispatch Thread中调用这个方法?如果没有,这可能是你的问题的原因。 – Taisin 2010-02-16 09:55:51
@Taisin:说真的,CardLayout是做这件事的正确方法。你避免这种情况的理由是没有道理的。 – 2010-02-16 10:22:41
@Michael Borgwardt:我很抱歉,但我的理由是为了避免?我不是这个问题的作者。 就我个人而言,我同意你的看法,我会在这种情况下使用Card Layout,但是作者的理由是他自己的,我只是指出上述代码无法工作的可能原因(即使该解决方案远不是最佳的)。 – Taisin 2010-02-16 13:50:57