CREANDO UNA ANIMACION EN JAVA

La animacion en java requiere dos pasos: construir un cadro de animacion (frame), y decirle a java que lo pinte (paint) y vuelva a pintar (repaint),como los cuadros son una sucesion de imagenes con prescedencia , esto da una ilusion de animacion y es lo que basicamente conforma la animacion

El metodo Paint , que ya lo ha usado en los ejemplo anteriores, es llamado cada vez que java pinta algo en pantalla, pero usted tambien puede decirle a java que pinte de nuevo el cuadro en el tiempo que usted requiera. esto y aunado a que usted crea un marco de animacion , osea varia imagenes con relacion , y luego las pinta en tiempos diferentes esto da una animacion

Recuerda los metodos start() y stop(), estos metodos hacen que empiece y pare el hilo de ejecucion del applet , como vera necesitaremos construir un thread para que podamos hacer que pinte y vuelva a pintar conforme necesitemos hacerlo, bueno lo que vamos a hacer acontinuacion es una de las animaciones mas simples que hay en java , haremos un reloj digital en un applet espero que esot de bases para que despues usted realice sus propias animaciones

Primero definire lo que hacen los metodos principales de la animacion:

El metodo start() detona la ejecucion del applet, usted puede escribir dentro de start() todo lo que el applet hace o puede hacerlo llamndo a metodos que usted crea.Para lo que usualmente fue hecho start() es para iniciar threads.

El metodo stop() este metodo hace lo contrario de lo que hace el metodo start() este detiene el applet y el thread que este creado actualmente , ususalmente este metodo es llamado cuando se hace cliclk hacia otra pagina, esto hace que cualquier cosas que este usando el cpu, que podria ser un thread se detenga.

para poder iniciar nuestra animacion primero veamos el codigo y luego lo explicaremos:
 

import java.awt.Graphics;

import java.awt.Font;

import java.util.Date;
 
 

  public class DigitalThreads extends java.applet.Applet

      implements Runnable {
 
 

      Font theFont = new Font("TimesRoman", Font.BOLD, 24);

      Date theDate;

      Thread runner;
 
 

     public void start() {

         if (runner == null); {

             runner = new Thread(this);

             runner.start();

     }

     }
 
 

     public void stop() {

         if (runner != null) {

             runner.stop();

             runner = null;

         }

     }
 
 

 public void run() {

     while (true) {

         theDate = new Date();

         repaint();

         try { Thread.sleep(1000); }

         catch (InterruptedException e) { }

     }

 }
 
 

     public void paint(Graphics g) {

         g.setFont(theFont);

         g.drawString(theDate.toString(),10,50);

     }

 }
 

Bueno pues empecemos:
Usted necesita hacer tres cosas para crear una animacion en java:
-poner en el applet la palabra reservada implements runnable
-Incluir una variable de instancia que tenga un thread
-modificar el metodo start() que hace mas que correr un thread
-modificar el metodo run() para que pare el applet ya hecho

en la primera parte de su applet usted tiene algo como esto:

  public class DigitalThreads extends java.applet.Applet implements Runnable{
...
}

hecho el primer paso seguimos con la addicion de una variable de instancia que contenga un thread , llamelo como usted prefiera, lo que va a ser es una variable de tipo thread, recuerde que thread es una clase ya hecha en el paquete java.Applet , vea como escribimos el metodo start():

     public void start() {

         if (runner == null); {

             runner = new Thread(this);

             runner.start();

            }
     }

Ahorita se preguntara si el metodo start() debe solamente correr y crear el thread donde estara el cuerpo de nuestro applet , pues en el metodo run() (no se olvide de el)

 public void run() {

     while (true) {

         theDate = new Date();

         repaint();

         try { Thread.sleep(1000); }

         catch (InterruptedException e) { }

     }

 }

run() contiene lo que usted necesite hacer , en este caso crea un objeto Date y llama al metodo repaint() que como todos sabremos lo que hace repaint es llamar al metdo paint() que hace lo siguiente:

     public void paint(Graphics g) {

         g.setFont(theFont);

         g.drawString(theDate.toString(),10,50);

     }

 }

lo que hace es sencillo escribe con la fuente actual la hora  en las coordenada 10,50.Recuerde que este metodo es llamado varias veces puesto que en el parrafo anterior el metodo repaint() se encuentra en un ciclo while infinito hasta que el usuario salga de la pagina

     public void stop() {

         if (runner != null) {

             runner.stop();

             runner = null;

         }

     }

Lo que hace ya sabemos para el thread crreado actualmente cuando el usuario salga de la pagina. Fue sencillo verdad , compile el programa y corralo vea los resultados.

Si abara notado si corrio el programa lo que se ve es un flick constante verdad? esto no es ningun error del programa o algo por el estilo lo que pasa que cuando nosotros llamamos al metodo repaint sucede lo siguiente

1.-La llamada a repaint() resulta en un llamado a el metodo update()
2.-el metodo update despeja la `pantalla de cualquier cosas que estuvo en ella y la llena con el color de background y de ahi llama a paint()
3.-El metodo paint() dibuja lo que le fue escrito en su cuerpo.

lo que usted puede hacer para remediarlo es sobrecargar el metodo update() que hace lo siguiente:

public void update(Graphics g) {

    g.setColor(getBackground());

    g.fillRect(0, 0, width, height);

    g.setColor(getForeground());

    paint(g);

}

lo que hace update() primero obtiene el color de background (fondo) que hay y llena todo el applet con ese color despues obtiene o pone en uso el color foreground (color de pintado) .
 

Veamos este ejemplo:
este es un applet que tiene parpadeo:

   import java.awt.Graphics;

    import java.awt.Color;

 

   public class Checkers extends java.applet.Applet

       implements Runnable {
 
 

       Thread runner;

       int xpos;

 

       public void start() {

         if (runner == null); {

              runner = new Thread(this);

              runner.start();

          }

      }
 
 

    public void stop() {

          if (runner != null) {

              runner.stop();

              runner = null;

          }

      }

 

  public void run() {

      setBackground(Color.blue);

     while (true) {

         for (xpos = 5; xpos <= 105; xpos+=4) {

              repaint();

              try { Thread.sleep(100); }

              catch (InterruptedException e) { }

          }

         for (xpos = 105; xpos > 5; xpos -=4) {

              repaint();

              try { Thread.sleep(100); }

              catch (InterruptedException e) { }

          }

      }

  }
 
 

      public void paint(Graphics g) {

          // Draw background

          g.setColor(Color.black);

         g.fillRect(0, 0, 100, 100);

         g.setColor(Color.white);

          g.fillRect(101, 0, 100, 100);
 

         // Draw checker

          g.setColor(Color.red);

          g.fillOval(xpos, 5, 90, 90);

      }

  }
 
 
 
 
 

Veamos el applet ya arreglado

 import java.awt.Graphics;

 import java.awt.Color;

 

 public class Checkers2 extends java.applet.Applet implements Runnable {

 

     Thread runner;

     int xpos;

     int ux1,ux2;

 

     public void start() {

         if (runner == null); {

             runner = new Thread(this);

             runner.start();

         }

     }
 
 

     public void stop() {

         if (runner != null) {

             runner.stop();

             runner = null;

         }

     }
 
 

     public void run() {

         setBackground(Color.blue);

         while (true) {

             for (xpos = 5; xpos <= 105; xpos += 4) {

                 ux2 = xpos + 90;

                 repaint();

                 try { Thread.sleep(100); }

                 catch (InterruptedException e) { }

                 if (ux1 == 0) ux1 = xpos;

             }

             for (xpos = 105; xpos > 5; xpos -= 4) {

                 ux1 = xpos;

                 repaint();

                 try { Thread.sleep(100); }

                 catch (InterruptedException e) { }

                 if (ux2 == 0) ux2 = xpos + 90;

             }

         }

     }

     public void update(Graphics g) {

         g.clipRect(ux1, 5, ux2 - ux1, 95);

         paint(g);

     }
 
 

     public void paint(Graphics g) {

         // Draw background

         g.setColor(Color.black);

         g.fillRect(0, 0, 100, 100);

         g.setColor(Color.white);

         g.fillRect(101, 0, 100, 100);
 
 

         // Draw checker
         g.setColor(Color.red);

         g.fillOval(xpos, 5, 90, 90);
 
 

         // reset the drawing area

         ux1 = ux2 = 0;

     }

 }

Ejemplos de animaciones java::
http://torla.sendanet.es/sastre/sergiweb/java/ejemplos/index.html