2013-04-18 43 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