2012-02-19 32 views
24

Estoy escribiendo un programa donde tengo un JFrame y deseo eliminar todos los componentes del mismo, luego agregarle solo un componente y volver a pintar el marco. Lo que tengo hasta ahora es algo así como el código de abajo (llamada en un objeto que implementa JFrame, donde StartPanel implementa JPanel):¿Cómo eliminar todos los componentes de un JFrame en Java?

removeAll();  
startPanel = new StartPanel(); 
startPanel.setVisible(true); 
add(startPanel); 
revalidate(); 
repaint(); 

Sin embargo, cuando ejecuto el código que muestra una ventana vacía (no el startPanel) y cuando minimizo/cambio el tamaño de la ventana, la ventana se vuelve negra. Si dejo fuera el removeAll() y ya no hay elementos en el JFrame, muestra el panel de inicio muy bien. ¿Alguna idea sobre cómo eliminar realmente todo y luego mostrar el panel nuevo?

+1

Una palabra: [CardLayout] (http: // docs.oracle.com/javase/tutorial/uiswing/layout/card.html) –

+0

@HovercraftFullOfEels que podría funcionar, pero ¿hay alguna otra manera de hacerlo manualmente? y ¿por qué no funciona removeAll() como creo que debería? ¿Qué pasa si en otras partes del código necesito tener algunas combinaciones de diferentes componentes (no solo uno a la vez), entonces no quiero un CardLayout? – scaevity

Respuesta

44

Debe llamar

getContentPane().removeAll(); 

removeAll() no ha sido anulado como add() o remove() remitir a la contentPane según sea necesario.

+0

muchas gracias, ¡esto parece funcionar! – scaevity

+0

@scae: Kavka parece tener los ojos más agudos que el resto de nosotros. Buena captura y 1+. –

+0

Gracias por su respuesta concisa y útil. 'removeAll()' realmente debería haber sido anulado como 'add()' y 'remove()' de la manera que describiste. Otra de las extrañas peculiaridades de Java ... – Variadicism

5
getContentPane().removeAll(); 
getContentPane().repaint(); 
+0

No utilicé 'repaint()' y funciona correctamente. –

3

suponiendo que su objetivo es añadir algo más después de desactiva el marco que debe llamar a validar después de la adición de thoes componentes para actualizarlo

getContentPane().removeAll(); 
add(new component); 
validate(); 
Cuestiones relacionadas