2012-05-29 6 views
1

Структура любит это:Java Swing о динамической панели

У меня есть рамка и две кнопки - btnA, btnB

, когда я нажимаю btnA, createPanel() функция возвращает Panela, который будет отображаться в рама,

а также btnB.

btnA и btnB можно переключать.

Прежде чем добавить панель в рамку, я использую функцию clearPanel(), чтобы очистить существующие панели в кадре.

, но вопрос в том, когда я изменяю размер или щелкаю панель, я могу видеть предыдущие панели, которые необходимо удалить уже.

Есть ли что-нибудь, что я потерял?

public void actionPerformed(ActionEvent e) { 
    String buttonString = e.getActionCommand(); 
    if (buttonString.equals("A")) { 
     clearPanel(); 

     A = new APanel(); 
     this.getContentPane().add(A.createPanel(), BorderLayout.CENTER); 
     this.pack(); 

     componentMap.put("A", A); 
     btnB.setEnabled(true); 
     btnA.setEnabled(false); 
    } 
    else if (buttonString.equals("B")) { 
     clearPanel(); 

     chart = new BPanel(); 
     this.getContentPane().add(B.createPanel(), BorderLayout.CENTER); 
     this.pack(); 

     componentMap.put("B", B); 
     btnA.setEnabled(true); 
     btnB.setEnabled(false); 
    } 
} 

private void clearPanel() { 
    if (!componentMap.isEmpty()) { // I store panels in a HashMap 
     for (Object o: componentMap.values()) { 
      this.getContentPane().remove((JPanel)o); 
     } 
     this.getContentPane().invalidate(); 
     componentMap.clear(); 
    } 
} 
+2

1) Используйте [ 'CardLayout'] (http://docs.oracle.com/javase/7 /docs/api/java/awt/CardLayout.html) 2) Чтобы получить более эффективную помощь, опубликуйте [SSCCE] (http://sscce.org/). –

+1

Вот почему я ответил на эту тему [Почему revalidate()/repaint() на JFrame после добавления в перспективе?] (Http://stackoverflow.com/questions/10671449/java-swing-questions-in -actionlistener). 'pack()' не предназначен для таких вещей, хотя вы пошли с этим ответом, так как советует @AndrewThompson, идите с CardLayout, если хотите, чтобы головные боли, связанные с 'revalidate()/repaint()' от себя :-) –

+1

Посмотрите на этот [пример] (http://stackoverflow.com/questions/8854939/switching-jpanel-within-main-window/8855076#8855076) и [еще один пример] (http: // stackoverflow .com/questions/9394137/one-jframe-and-two-jpanels/9394369 # 9394369) –

ответ

2

Вы добавляете A.createPanel() и B.createPanel() к ContentPane но хранить A и B в вашем componentMap. Поэтому, когда вы вызываете this.getContentPane().remove((JPanel)o);, вы делаете это на A и/или B, которые не находятся в области содержимого, и поэтому вы ничего не удаляете.

Вы могли бы использовать более простой/безопасный подход, если вы хотите, чтобы очистить область содержимого:

this.getContentPane().removeAll(); 
+0

За исключением компонента componentMap, я также использую this.getContentPane(). add() для хранения A или B. Я не могу использовать removeAll (), поскольку он удалит некоторые из других контроллеров на панели содержимого. – user1371541

+0

@ user1371541 опубликуйте SSCCE, если вы хотите получить полный ответ. Независимо от того, что вы пытаетесь сделать, тот факт, что вы не храните правильный компонент, который вы добавляете в панель контента, определенно является проблемой (но невозможно определить, является ли это вашей единственной проблемой) –

+0

хорошо, я попробую. . Спасибо за комментарий – user1371541

Смежные вопросы