2013-04-18 46 views
0

在java swing库中remove和removeAll之间的区别是什么? 我有一个控制面板和一个面板,可以通过控制面板进行更改。 这个改变是在父框架对象中完成的。 当我使用的代码: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消失,但使用时去掉不?

+0

基于几行代码无法判断发生了什么。从第一个例子看,你有多个面板。所以remove()的工作方式与removeAll不同。任何你不应该使用remove()或removeAll()。而是使用'CardLayout'来为你管理这个功能。 – camickr

回答

3

方法名是一个很大的提示,并明确的答案是的javadoc:

Container.remove(Component):“从这个容器中移除指定组件

对于Container.removeAll()

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

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

尝试在两种情况下的“删除”后调用并记录/打印getComponentCount()

+0

这就是问题所在,选中的面板位于JScrollPane中,因此JScrollpane仍然存在! – Jetse