Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/05/2010, 10:35
x7iBiT
 
Fecha de Ingreso: mayo-2010
Mensajes: 2
Antigüedad: 14 años
Puntos: 0
Duda con Threads, Graphics2D y Animaciones

Buenas, estoy haciendo un programa que dibuje polinomios por medio de Graphics2D. Hasta aquí ningún problema, pero me han pedido que el programa tenga una opción para dibujar el polinomio de forma animada.

El Polinomio lo calculo previamente en un GeneralPath, y luego si la opción de la animación está activada, la hago desde una "inner class" de tipo Thread. En dicha clase voy recorriendo el GeneralPath con un PathIterator, y voy uniendo todos sus puntos con Line2D. Para hacer un efecto de animación lo que hago es que cada 5 iteraciones duermo el proceso un número X de milisegundos ( sleep(x) ):

Código Java:
Ver original
  1. private class ThreadAnim extends Thread {
  2.    public void run() {
  3.       Line2D.Float line = new Line2D.Float();
  4.       PathIterator pi = pathFunc.getPathIterator(null);
  5.       float[] coord = new float[6];
  6.       float[] coordAnt = new float[2];
  7.  
  8.       try {
  9.          for (int i = 0; !pi.isDone(); i++) {
  10.             pi.currentSegment(coord);
  11.             if (i == 0) {
  12.                coordAnt[0] = coord[0];
  13.                coordAnt[1] = coord[1];
  14.             } else {
  15.                line.setLine(coordAnt[0], coordAnt[1],
  16.                            coord[0], coord[1]);
  17.                g2.draw(line);
  18.                coordAnt[0] = coord[0];
  19.                coordAnt[1] = coord[1];
  20.             }
  21.             if ( ((i % 5) == 0) && (i != 0) ) {
  22.                sleep(10);
  23.             }
  24.             pi.next();
  25.          }
  26.       } catch (InterruptedException e) {
  27.          System.out.println("Interrupted Exception");
  28.       }
  29.    }
  30. }


Esto supuestamente debería de funcionar pero lo que pasa es que todas las líneas del método de arriba se dibujan de golpe al final. Es como si el Graphics2D (g2) fuera como un buffer en el que los cambios no se aplican siempre inmediatamente. La dudas mías son:
  • ¿Hay algun método para un Graphics2D que actualice el dibujo con los últimos cambios? Vamos que sería algo así como un flush con un stream de C por ejemplo. La verdad es que me he vuelto loco intentando buscar algo parecido y no he encontrado nada.
  • Alguna otra forma de hacer una animación sin tener que redibujar todo cada vez (o sea sin tener que hace un repaint() cada vez)?


Muchas gracias de antemano por cualquier info que me puedan dar.