2010-02-15 75 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