Revalidar Java Swing() vs repintar()

Resuelto William asked hace 15 años • 5 respuestas

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, descubro que el contenido antiguo todavía es visible (aunque oscurecido por el contenido nuevo). Si agrego una llamada repaint()además de revalidate(), funciona como se esperaba.

Seguro que en otras ocasiones he experimentado que con solo llamar revalidate()es suficiente.

Básicamente, mi pregunta es: ¿debería llamar a ambas funciones y, de no ser así, cuándo debería llamar a cada una de ellas?

William avatar Jul 08 '09 17:07 William
Aceptado

Necesitas llamar 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 niños eliminada por removeAll()); el segundo le dice al administrador de diseño que vuelva a calcular el diseño (lo cual es necesario al agregar componentes). Esto debería hacer que los elementos secundarios del panel se vuelvan a pintar, pero es posible que no haga que el panel en sí lo haga (consulte esto para obtener la lista de activadores de repintado).

En una nota más general: en lugar de reutilizar el panel original, recomendaría crear un panel nuevo e intercambiarlo en el panel principal.

kdgregory avatar Jul 08 '2009 11:07 kdgregory

Cada vez que hagas un remove() o un removeAll(), debes llamar

  validate();
  repaint();

después de haber completado la adición () de los nuevos componentes.

Llamar a validar() o revalidar() es obligatorio cuando realiza una eliminación(); consulte los javadocs relevantes.

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

Noel Grandin avatar Feb 10 '2010 12:02 Noel Grandin

revalidatese llama en un contenedor una vez que se agregan nuevos componentes o se eliminan los antiguos. esta llamada es una instrucción para indicarle al administrador de diseño que reinicie según la nueva lista de componentes. revalidateactivará una llamada para repintar lo que el componente cree que son "regiones sucias". Obviamente, no todas las regiones de su archivo JPanelse consideran sucias RepaintManager.

repaintse utiliza para indicarle a un componente que se repinte. A menudo ocurre que necesita llamar a esto para limpiar condiciones como la suya.

akf avatar Jul 08 '2009 11:07 akf

revalidate()solo solicite diseñar el contenedor, cuando experimentó que simplemente llamar revalidate()funciona, podría deberse a que la actualización de los límites de los componentes secundarios se activa repaint()cuando sus límites se cambian durante el rediseño. En el caso que mencionó, solo se elimina el componente y no se cambian los límites de ningún componente, este caso no repaint()se activa "accidentalmente" .

Antony Ng avatar Aug 16 '2017 15:08 Antony Ng