español - core java volume i--fundamentals, 1(11th edition) pdf
Java Swing revalidate() vs repaint() (5)
Cada vez que haga un remove () o un removeAll (), debe llamar
validate();
repaint();
después de haber completado agregar () los nuevos componentes.
Llamar validate () o revalidate () es obligatorio cuando hace un remove () - vea los javadocs relevantes.
Mi propia prueba indica que repaint () también es necesario. No estoy seguro exactamente por qué.
Estoy armando una aplicación Swing donde a menudo quiero reemplazar el contenido de un JPanel. Para hacer esto, estoy llamando a removeAll()
, luego agrego mi nuevo contenido y luego llamo revalidate()
.
Sin embargo, estoy descubriendo que el contenido antiguo todavía es visible (aunque está oculto por el contenido nuevo). Si agrego una llamada a repaint()
además de revalidate()
, funciona como se esperaba.
Estoy seguro que en otras ocasiones he experimentado que solo llamar a revalidate()
es suficiente.
Básicamente, mi pregunta es: ¿debo llamar a ambas funciones y, de no ser así, cuándo debo llamar a cada una de ellas?
sí necesitas llamar repintar (); revalidar(); cuando llama a removeAll (), entonces tiene que llamar a repaint () y revalidate ()
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 niños eliminados por removeAll()
); el último le dice al administrador de diseño que vuelva a calcular el diseño (que es necesario al agregar componentes). Esto debería causar que los elementos secundarios del panel vuelvan a pintar, pero puede que no lo haga el propio panel (vea this para ver la lista de disparadores de repintado).
En una nota más general: en lugar de reutilizar el panel original, recomendaría crear un nuevo panel y cambiarlo al padre.
revalidate()
solo solicita el diseño del contenedor, cuando experimentó simplemente llamar a revalidate()
funciona, esto podría deberse a que la actualización de los componentes de los componentes secundarios desencadena repaint()
cuando sus límites se modifican durante el rediseño. En el caso que mencionó, solo se eliminaron los componentes y no se modificaron los límites de los componentes, este caso no se repaint()
accidentalmente .
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 de diseño que debe restablecerse 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, no todas las regiones en su JPanel
se consideran sucias por el RepaintManager
.
repaint
se utiliza para indicar a un componente que se repintar. A menudo es el caso de que necesite llamar a esto para condiciones de limpieza como la suya.