2009-05-23 13 views
9

Me doy cuenta de que la mayoría del código Java sobrescribe paint o paintComponent, la mayoría de ellos no restaura el estado anterior del objeto gráfico, después de cambiar el estado de los gráficos objeto. Por ejemplo, setStroke, setRenderingHint ...La necesidad de restaurar el estado original de los gráficos cuando se sobrescribe paint o paintComponent

Me preguntaba si es una buena práctica que restauremos el antiguo estado del objeto gráfico, antes de volver del método. Por ejemplo

public void paintComponent(Graphics g) { 
    super.paintComponet(g); 
    Stroke oldStroke = g.getStroke(); 
    g.setStroke(newStroke); 
    // Do drawing operation. 
    g.setStroke(oldStroke); 
} 

¿Es esta una buena práctica? ¿O se acabó?

Respuesta

15

No debe alterar el objeto Graphics pasado en absoluto, en lugar de realizar todas las operaciones de gráficos en una copia de la que luego se deshace. No habrá necesidad de restablecer el estado en absoluto.

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

Voy a apoyar esta respuesta con el Javadoc de JComponent que está de acuerdo en: http : //docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paintComponent%28java.awt.Graphics%29 –

3

Sí, esta es una muy buena práctica a seguir. No paga mucho en rendimiento (en relación con la operación real de pintura), y se ahorra un lío de dolor si está realizando cambios inusuales en el contexto gráfico. Sin embargo, no exagere: probablemente no tenga que preocuparse por la configuración del color, por ejemplo.

La alternativa es no asumir nada sobre el contexto de gráficos, y establecer todas las propiedades necesarias antes de cada pintura, en caso de que estén configuradas en algo wonky. Trate de evitar la creación y disposición libre de objetos gráficos para cada operación.

propiedades específicas que pueda recuperar siempre si modificado: (porque pueden hacer malas cosas y tener consecuencias inesperadas):

  • Transformar - debido a las modificaciones a esta apilarán una encima de la otra y obtener muy, muy difícil de reiniciar. Cuidado: esto es modificado por los métodos de traducción, corte, escala, rotación y transformación de Graphics2D. La modificación de transformadas se debe usar con PRECAUCIÓN.
  • Trazo - porque (al menos en mi configuración), dejando este valor predeterminado se ejecuta mucho más rápido que cualquier configuración incluso si es equivalente a la predeterminada. No preguntes: es el resultado de las líneas de gráficos de Java2D que aceleran el caso predeterminado utilizando hardware de gráficos.
  • Clip: dará lugar a extraños errores donde solo se dibuja una parte de la pantalla.
  • Compuesto: la mayoría de las operaciones probablemente no esperen que esto sea algo extraño.

Propiedades para no preocuparse por:

  • RenderingHints. Estas son cosas que puede configurar y restaurar fácilmente y, en general, desea dejarlas configuradas de determinada manera (antialiasing, etc.) durante todo el tiempo en que se ejecuta la aplicación. Cambiar RenderingHints raramente interrumpirá el renderizado de componentes, aunque podría hacerlo más feo.
  • Color de fondo y color de la pintura. La mayoría de las cosas las modificarán antes de dibujar de todos modos.
  • Fuente: del mismo modo.
+0

Debería encontrar que crear un objeto Graphics es extremadamente económico. –

+0

Er ... sí, corregido.Todavía pienso que no es una buena práctica, sin embargo, porque nunca se sabe qué más está utilizando un objeto Graphics, y se perderá la configuración para RenderingHints, etc. – BobMcGee

Cuestiones relacionadas