tutorial que pasos para interfaz grafica español ejemplos crear componentes componente java swing graphics awt paintcomponent

java - que - swing containers



¿Por qué swing dibuja un componente simple dos veces? (3)

El artículo Pintura en AWT y Swing: Propiedades adicionales de la pintura: Opacidad sugiere por qué: "La propiedad opaca permite que el sistema de pintura Swing detecte si una solicitud de repintado en un componente en particular requerirá o no el repintado adicional de los antepasados ​​subyacentes". Debido a que extiende JComponent , la propiedad opaque es falsa de forma predeterminada y la optimización no es posible. Establezca la propiedad true para ver la diferencia, así como el artefacto de no respetar la propiedad. Se pueden encontrar ejemplos relacionados aquí y aquí .

Aquí hay un ejemplo simple de dibujar un óvalo.

public class SwingPainter extends JFrame{ public SwingPainter() { super("Swing Painter"); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); getContentPane().add(new MySwingComponent()); setSize(200, 200); setVisible(true); } public static void main(String[] args) { new SwingPainter(); } class MySwingComponent extends JComponent { public void paintComponent(Graphics g) { System.out.println("paintComponent"); super.paintComponent(g); g.setColor(Color.red); g.fillOval(10, 10, 50, 50); } @Override protected void paintBorder(Graphics g) { System.out.println("Paint border"); super.paintBorder(g); } @Override protected void paintChildren(Graphics g) { System.out.println("Paint children"); super.paintChildren(g); } } }

Pero en el modo de depuración o agregando alguna información a la consola antes del dibujo (como en el ejemplo), puede ver que la oscilación dibuja los componentes dos veces.

paintComponent

Pintar borde

Pintar niños

paintComponent

Pintar borde

Pintar niños

No puedo entender por qué sucede, pero creo que puede afectar el rendimiento en una GUI difícil.


Esto funciona bien para mí. De hecho, incluso en modo de depuración, la salida fue:

paintComponent Paint border Paint children

Tenga en cuenta que en los componentes AWT y Swing hay muchos métodos (paint, paintBorder, paintChildren, paintComponent, repaint y otros) que se llaman mediante devolución de llamada, siempre que el motor de la GUI lo considere adecuado. Eso puede variar de JVM a JVM o incluso de diferentes sesiones de ejecución. También pueden activarse desde la interacción con su programa (si minimiza / maximiza, por ejemplo). O pueden no, en absoluto.


Estoy de acuerdo con Konstantin, lo que necesita recordar, el administrador de repintado responde a cualquier cantidad de solicitudes cuando se inicia la aplicación, esto generalmente incluye la solicitud de pintura inicial cuando se muestra y cambia el tamaño de la ventana (hay dos).

Prueba esto. Espere hasta que la aplicación se esté ejecutando y cambie el tamaño de la ventana. Estoy seguro de que obtendrá más de un par de solicitudes de repintado;)