0

java swing库中remove和removeAll有什么区别?我有一个控制面板和一个可以用控制面板更改的面板。此更改在父框架对象中完成。当我使用代码时:

public void showNextPanel(){
        if(hasNextPanel()){
            getSelectedPanel().setVisible(false);
            getContentPane().removeAll();
            getContentPane().add(controlPanel);
            selectedPanel++;
            getContentPane().add(getSelectedPanel());
            getSelectedPanel().setVisible(true);
            revalidate();
            repaint();
        }else{
            System.exit(0);
        }
    }

然后一切都按预期工作。当我在 remove 语句中更改 removeAll 时,这个选定的面板变为灰色,但仍然可见。调整我的框架大小时,新框架是可见的,您可以看到它隐藏在先前选定的面板后面。然后我的代码是:

public void showNextPanel(){
        if(hasNextPanel()){
            getSelectedPanel().setVisible(false);
            getContentPane().remove(getSelectedPanel());
            selectedPanel++;
            getContentPane().add(getSelectedPanel());
            getSelectedPanel().setVisible(true);
            revalidate();
            repaint();
        }else{
            System.exit(0);
        }
    }

为什么我的 JPanel 在使用 removeAll 时会消失,但在使用 remove 时不会消失?

4

1 回答 1

3

方法名称是一个很大的提示,确定的答案在 javadocs 中:

对于Container.remove(Component)

“从此容器中删除指定的组件。”

对于Container.removeAll()

“从这个容器中删除所有组件。”

至于导致行为差异的原因,我的猜测是面板中还有一些其他组件在第一种情况下被删除,但在第二种情况下没有。

getComponentCount()在两种情况下都尝试在“删除”之后调用和记录/打印。

于 2013-04-18T14:45:27.563 回答