Java Swing revalidate () frente a repintado ()

Estoy armando una aplicación Swing donde a menudo quiero reemplazar el contenido de un JPanel. Para hacer esto, llamo removeAll() , luego agrego mi nuevo contenido y luego llamo revalidate() .

Sin embargo, estoy descubriendo que el contenido antiguo todavía es visible (aunque oscurecido por el nuevo contenido). Si agrego una llamada a repaint() además de revalidate() , funciona como se esperaba.

Estoy seguro de que en otras ocasiones he experimentado que solo llamar a revalidate() es suficiente.

Así que, básicamente, mi pregunta es: ¿Debería llamar a ambas funciones? Si no, ¿cuándo debería llamar a cada una de ellas?

repaint() llamar a repaint() y revalidate() . El primero le dice a Swing que un área de la ventana está sucia (lo cual es necesario para borrar la imagen de los viejos hijos eliminados por removeAll() ); este último le dice al administrador de diseño que vuelva a calcular el diseño (que es necesario al agregar componentes). Esto debería hacer que los niños del panel vuelvan a pintar, pero puede que el panel no lo haga (consulte la lista de desencadenantes de repintado).

En una nota más general: en lugar de reutilizar el panel original, recomiendo construir un nuevo panel y cambiarlo por el padre.

Cada vez que elimine () o quite todo (), debe llamar

  validate(); repaint(); 

después de completar add () ‘ing los nuevos componentes.

Llamar a validate () o revalidate () es obligatorio cuando haces un remove () – mira los javadocs relevantes.

Mis propias pruebas indican que volver a pintar () también es necesario. No estoy seguro exactamente por qué.

se solicita la revalidate en un contenedor una vez que se agregan nuevos componentes o se eliminan los antiguos. esta llamada es una instrucción para indicar al administrador del diseño que se reinicie en función de la nueva lista de componentes. revalidate activará una llamada para revalidate a pintar lo que el componente cree que son ‘regiones sucias’. Obviamente, JPanel no considera que todas las regiones de su JPanel están sucias.

repaint se usa para indicar a un componente que se repinte a sí mismo. A menudo es el caso que necesita llamar a esto para condiciones de limpieza como la suya.

revalidate() simplemente solicite el diseño del contenedor, cuando experimentó simplemente call revalidate() funciona, podría ser causado por la actualización de los límites de los componentes secundarios desencadena el repaint() cuando se modifican sus límites durante el reordenamiento. En el caso que mencionó, solo se eliminaron los componentes eliminados y no se modificaron los límites de los componentes, en este caso no se desencadenó “accidentalmente” el repaint() .

sí, necesita llamar a repintado (); revalidar(); cuando llamas a removeAll (), entonces tienes que llamar a repaint () y revalidar ()