2013-04-18 3 views
0

В чем разница между remove and removeAll в библиотеке java swing? У меня есть одна панель управления и панель, которую можно изменить с помощью панели управления. Это изменение выполняется в родительском объекте кадра. Когда я использую код:Java swing difference remove and 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); 
     } 
    } 

Тогда все работает так, как ожидалось. Когда я изменяю removeAll в инструкции remove, эта выбранная панель становится серой, но все же видимой. При изменении размера моего кадра новый кадр видим, вы можете видеть, что он скрывается за предыдущей выбранной панелью. Тогда мой код:

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?

+0

Не могу сказать, что происходит на основе нескольких строк кода. Из первого примера видно, что у вас несколько панелей. Поэтому remove() будет работать иначе, чем removeAll. Любые вы не должны использовать remove() или removeAll(). Вместо этого использование «CardLayout» будет управлять этой возможностью для вас. – camickr

ответ

3

имен методов являются большим намеком, а окончательный ответ в Javadocs:

Для Container.remove(Component):

«Удаляет указанного компонент из этого контейнера.»

Для Container.removeAll():

"Удаляет все компоненты из этого контейнера."

Что касается разницы в поведении, то я предполагаю, что на панели есть какой-то другой компонент, который удаляется в первом случае, но не во втором случае.

Попробуйте позвонить и зарегистрировать/распечатать getComponentCount() после «удаления» в обоих случаях.

+0

В этом была проблема, выбранная панель находилась внутри JScrollPane, так что JScrollpane все еще был там! – Jetse