我目前正在用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