no se vuelve a pintar mientras se cambia el tamaño al usar .setPaint (gradiente)

Tan pronto como uso gradientes en mi código, el repintado no se realiza mientras se cambia el tamaño, se obtiene algo así mientras se cambia el tamaño (rectangularjs negros donde se ha cambiado el tamaño, vea la imagen en el enlace a continuación). Y cuando dejo de cambiar el tamaño, todo se dibuja de nuevo, pero sólo entonces.

si no uso g2d.setPaint(gradient); Tengo un redibujado rápido

http://gui-builder.com/C41142775162.rar

 public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; //sample of the code GradientPaint gradient = new GradientPaint(startX, startY, greyColor1, endX, endY, new Color(120,120,120)); g2d.setPaint(gradient); g.drawLine(i, startY, i, endY); } 

Intenté volver a repaint() al cambiar el tamaño, intenté volver a repaint() cuando el mouse se arrastró pero nada.


Aquí hay algunos SSCCE (lo siento, no lo publiqué antes):

BufferedImage aa;

 @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics gr = aa.getGraphics(); Graphics2D g2d = (Graphics2D)gr; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); for (int i = 0; i < this.getWidth(); i++) { LinearGradientPaint lgp = new LinearGradientPaint( new Point2D.Float(0, 0), new Point2D.Float(0, this.getHeight()), new float[] {0f, 0.5f, 1f}, new Color[] {Color.BLUE, Color.RED, Color.BLUE} ); g2d.setPaint(lgp); gr.drawLine(i, 0, i, this.getHeight()); } g.drawImage(aa, 0, 0, frame); } 

y en tu constructor:

aa = new BufferedImage (100, 100, BufferedImage.TYPE_INT_ARGB);

Todavía necesito una respuesta de por qué no se realiza el redibujo cuando redimensiono la ventana (mientras muevo la esquina de redimensionamiento de la ventana)


Bien, para resumir: probé los tres métodos principales de dibujo en Java, que son BufferStrategy, imagen con búfer de doble swing y swing simple sin búfer de imagen. Y encontré que el más rápido es el último (sorprendentemente).

Ahora estoy usando el rápido y descubrí que primero cambiar el tamaño de la ventana a un tamaño pequeño y luego cambiar el tamaño de la ventana a un tamaño grande hace que el problema desaparezca. No te rías, ese es mi problema y ese es un misterio total. Aquí hay un video de ella: C41142775162.rar

¿Qué pasa cuando cambio el tamaño a un tamaño pequeño? no se. Pero si conoces alguna ayuda sería muy apreciada.

Gracias

Jeff


También descubrí que es mejor usar setPaint tan poco como sea posible. Puede ejecutar pruebas y verá que es mucho más rápido no usar setPaint () con demasiada frecuencia. por ejemplo, en lugar de usar:

 LinearGradientPaint gradient1 = new LinearGradientPaint( new Point2D.Float(0, 0), new Point2D.Float(0, 10), new float[] {0f, 1f}, new Color[] {new Color(40,40,40), new Color(110,110,110)} ); LinearGradientPaint gradient2 = new LinearGradientPaint( new Point2D.Float(0, 10), new Point2D.Float(0, 20), new float[] {0f, 1f}, new Color[] {new Color(110,110,110), new Color(190,190,190)} ); LinearGradientPaint gradient3 = new LinearGradientPaint( new Point2D.Float(0, 20), new Point2D.Float(0, 30), new float[] {0f, 1f}, new Color[] {new Color(190,190,190), new Color(250,250,250)} ); for (int i = 0; i < this.getWidth(); i++) { g2d.setPaint(gradient1); gr.drawLine(i, 0, i, 10); g2d.setPaint(gradient2); gr.drawLine(i, 10, i, 20); g2d.setPaint(gradient3); gr.drawLine(i, 20, i, 30); } 

utilizar :

 LinearGradientPaint gradient1 = new LinearGradientPaint( new Point2D.Float(0, 0), new Point2D.Float(0, 10), new float[] {0f, 1f}, new Color[] {new Color(40,40,40), new Color(110,110,110)} ); LinearGradientPaint gradient2 = new LinearGradientPaint( new Point2D.Float(0, 10), new Point2D.Float(0, 20), new float[] {0f, 1f}, new Color[] {new Color(110,110,110), new Color(190,190,190)} ); LinearGradientPaint gradient3 = new LinearGradientPaint( new Point2D.Float(0, 20), new Point2D.Float(0, 30), new float[] {0f, 1f}, new Color[] {new Color(190,190,190), new Color(250,250,250)} ); g2d.setPaint(gradient1); for (int i = 0; i < this.getWidth(); i++) gr.drawLine(i, 0, i, 10); g2d.setPaint(gradient2); for (int i = 0; i < this.getWidth(); i++) gr.drawLine(i, 10, i, 20); g2d.setPaint(gradient3); for (int i = 0; i < this.getWidth(); i++) gr.drawLine(i, 20, i, 30); 

¡Incluso si tiene muchos cálculos, será casi cada vez más rápido!

Hice una prueba y descubrí que el GradientPaint tiene un rendimiento lamentable. Tomando un tiempo de render promedio de 1.2 segundos (a 400×400 pixeles) a más de 20 segundos.

Cambié GradientPaint por LinearGradientPaint y descubrí que el tiempo de renderización era de alrededor de 1.3 segundos.

 LinearGradientPaint lgp = new LinearGradientPaint( new Point2D.Float(0, minY), new Point2D.Float(0, maxY), new float[] {0f, 0.5f, 1f}, new Color[] {Color.BLUE, Color.RED, Color.BLUE} ); g2d.setPaint(lgp); // Render all your samples, don't reapply or change you paint... 

Lo siento, mi muestra no es muy emocionante …

introduzca la descripción de la imagen aquí

Tal vez le resulte mejor renderizar a un búfer de respaldo en un hilo de fondo y pintar la imagen completa en la pantalla una vez que esté completa. Esto evitará que la pantalla se “detenga”

Si esto es un applet, pon esa cosa en

 public void start() { } 

y

 public void stop() { }