Pregunta

Algunos usuarios de nuestra aplicación Swing han reportado artefactos extraños que aparecen en la pantalla. Esto abarca desde componentes que no se repintan correctamente por un segundo o dos, hasta partes completas de la aplicación que se repintan como papel tapiz de azulejos en áreas de la ventana.

La aplicación ha sido desarrollada por desarrolladores de todos los niveles, desde chicos con experiencia en Java hasta jóvenes que han salido de la universidad a lo largo de aproximadamente cinco años, y, como cabría esperar, algunos de los códigos AWT son un verdadero desastre. . Ahora me enfrento a la tarea de tratar de corregir la mayor parte de la maldad que pueda durante los próximos meses.

Algo de esto es fácil de manejar. Trate los componentes solo en el hilo de despacho de eventos, IO de forma asíncrona, algo así, y espero que llegue el mensaje al resto del equipo.

Lo que me gustaría saber es la mejor manera de lidiar con contextos de Gráficos, especialmente en un contexto de paintComponent (). Veo un montón de ...

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g;
    // ...Whole lotta drawing code...
}

¿Es una mejor práctica hacer esto?

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g.create();
    // ...Whole lotta drawing code...
    gfx.dispose();
}

Si el parámetro g se va a reutilizar en otras pinturas, ¿no necesito restaurarlo a un buen estado, deshacer AffineTransforms, etc.?

¿Fue útil?

Solución

Según Filthy Rich Clients, no debe alterar el objeto Graphics que se le pasa (lo que apesta como API, IMO).

La forma correcta de manejarlo es un poco más detallada:

public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
         // ...Whole lotta drawing code...
    } finally {
         g.dispose();
    }
}

IIRC, en la implementación de Sun, no importa si no eliminas " sub-Graphics " objetos. (No me cites en eso.)

Es posible que desee delegar ese bit de comentario a otro objeto.

Otros consejos

He oído que esto se ha solucionado en jdk-1.6.12, pero no lo intenté.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top