2010-12-09 9 views
13

Duplicar posible:
Java Swing revalidate() vs repaint()Java swing: repaint() vs invalida

Hola a todos

estoy luchando con mi programa para que sea de actualización en el momento adecuado .

Y no tener mucho éxito lol

tengo 2 preguntas

P1: ¿cuál se debe utilizar cuando mi interfaz ha cambiado: pintar o invalidar?

Q2: ¿cuándo deberían llamarse? Sé que suena estúpido, pero en realidad tengo problemas debido a SwingWorker y otras operaciones con hilos.

+0

No diría que "invalidar" y "revalidar" son lo mismo. –

Respuesta

25

P1: ¿cuál se debe usar cuando mi interfaz ha cambiado: pintar o invalidate?

Si el diseño no está actualizado debido a cambio de tamaño, cambio de fuente, etc., entonces debe llamar a invalidar. Al invalidar un componente, se invalida el componente y todos los elementos superiores se marcan como necesarios. Antes de pintar, en el paso de validación si no se encuentra ningún cambio, entonces el paso de pintura se omite.

Si hay alguna parte del componente que se está actualizando (definida por el rectángulo del clip del gráfico, llamado "dañado" región), entonces debería considerar llamar a volver a pintar. Una de las razones por las que pueden ocurrir regiones dañadas es la superposición de una parte de su componente debido a algún otro componente o aplicación. Según mi experiencia, el repintado() es más efectivo si lo llama en el componente interno más interno (es decir, usando public void repaint(int x, int y, int width, int height) en lugar de usar void repaint() público).

Q2: ¿cuándo deberían llamarse?

Invalidate(): marca un componente que no es válido - eso significa, que es la disposición es o no ser "actualizados" más: es decir, el componente cambia de tamaño, se añade un borde, que es cambios de fuente, etc. nunca debería necesitar llamar invalidate() a mano, ya que swing hace eso por usted prácticamente por cada cambio de propiedad.

Cuando es necesario repintar más de una región dentro del control, Invalidar hará que toda la ventana se vuelva a pintar en una sola pasada, evitando el parpadeo causado por repintados redundantes. No hay ninguna penalización en el rendimiento por invocar Invalidar varias veces antes de que el control se vuelva a pintar.

Repaint() : Si el componente es liviano, este método llama al método de pintura de este componente lo antes posible. De lo contrario, este método provoca una llamada al método de actualización de este componente lo antes posible.

También tenga en cuenta el método Update.

NOTA: Swing procesa las solicitudes de "repintado" de una manera ligeramente diferente de la AWT, aunque el resultado final para el programador de aplicaciones es esencialmente el mismo: se invoca paint().

, consultar el siguiente enlace para obtener un excelente enlace en cómo la pintura se realiza en AWT y Swing:

http://www.oracle.com/technetwork/java/painting-140037.html

Esperamos que esto ayude.

+0

Al tratar con JComponents, use 'revalidate()' en lugar de 'invalidate()', para asegurar que toda la jerarquía de componentes se invalide cuando sea apropiado (vea también http://stackoverflow.com/questions/859493/remove-swing-component -using-validate-or-revalidate) –