Swing:动态显示面板

时间:2010-02-15 21:55:07

标签: java swing netbeans interface-builder

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

目前我认为这正在取代我的内部占位符面板......某些东西......但替代品似乎什么都没有。我不知道它是否重要但占位符和替换面板的大小相同。我是一个摇摆小块,所以任何提示都会非常感激。

2 个答案:

答案 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();
}

我知道设置实例变量实际上并不是将它作为子项添加,但我的想法是该变量将用于记住要删除或添加的面板。