2010-02-15 79 views
2

我目前正在用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(); 
} 

目前,我認爲這是代替我內部佔位符面板與...東西...,但替換似乎沒有包含任何內容。我不知道它是否重要,但佔位符和替換面板的大小相同。我是一個搖擺結界,所以任何提示將非常感激。

回答

7

setQueryHelperPanel()方法不起作用,因爲它通過remove()方法去除的this兒童收集現有的面板,但隨後沒有使用add()添加新的面板 - 它分配給實例變量不會導致它成爲一個孩子。

但是,對於您的問題更清潔的解決方案將使用CardLayout

0

感謝您的回覆。

我以前看過CardLayout,但我試圖避免它,因爲我知道它將所有面板加載到內存中,然後允許將它們交換出去。當我動態顯示面板時,我想保持完全控制。

忘記刪除是我的一個愚蠢的錯誤。我其實早些時候曾經這樣做,但它仍然無法正常工作。這是當前的交換方法:

public void setQueryHelperPanel(JPanel panel){ 
    this.remove(queryHelperPanel); 
    this.queryHelperPanel=panel; 
    this.add(queryHelperPanel); 
    this.queryHelperPanel.repaint(); 
    this.validate(); 
    this.repaint(); 
} 

據我所知,設置實例變量實際上並沒有將其添加爲一個孩子,但我的想法是,變量將被用來記住刪除哪些面板或添加。

+0

你是否在Event Dispatch Thread中調用這個方法?如果沒有,這可能是你的問題的原因。 – Taisin 2010-02-16 09:55:51

+0

@Taisin:說真的,CardLayout是做這件事的正確方法。你避免這種情況的理由是沒有道理的。 – 2010-02-16 10:22:41

+0

@Michael Borgwardt:我很抱歉,但我的理由是爲了避免?我不是這個問題的作者。 就我個人而言,我同意你的看法,我會在這種情況下使用Card Layout,但是作者的理由是他自己的,我只是指出上述代碼無法工作的可能原因(即使該解決方案遠不是最佳的)。 – Taisin 2010-02-16 13:50:57