5/1/10

Animación con Timer en java y netbeans


Se puede realizar animacion en java utilizando el objeto Timer el cual realiza operaciones cada cierto tiempo indicado por un temporizador. En este caso la operacion a realizar sera la de presentar en pantalla una secuencia de imagenes JEPG las cuales simular la animación.

La animación consiste en una japo comiendo, ayudandose de un jSlider se podra tambien acelerar o retardar la secuencia de imagenes




El proyecto consta de un JFrame con la siguiente distribucion de objetos
De una clase, la encargada de la animación animationclass.java, esta clase consiste en extender la propiedad jLabel y de añadirle un Timer, el cual es el encargado de la animacion.

El codigo de la clase animationclass.java es:

import java.awt.Dimension;
import java.util.Timer;
import javax.swing.*;
import java.awt.*;
import java.util.TimerTask;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class animationclass  extends javax.swing.JLabel {   
    private Timer tiempo ;
    private TimerTask task;
    private int speed = 60;
    private int frame=0;
    boolean run = false;
    
    //se crea el objeto y se redimensiona al tamaño del contenedor
    public animationclass(Dimension d){        
        this.setSize(d);
    }  
    //coloca una imagen en el objeto jlabel
    public void setimage(int n){        
        this.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/japo_" + n + ".jpg"))); 
    }
    //coloca la velocidad en la variable 
    public void setvelocidad(int v){
        this.speed= v;        
    }
  //para la animacion  
  public void startAnimation() {    
           run=true;
           tiempo = new Timer();
           task = new TimerTask() {               
               public void run() {
                   frame++;                   
                   if (frame<=10){
                        setimage(frame);
                   }
                   else{frame=0;}
               }
           };
           //se inicia la animacion
           System.out.println("Se inicia la animacion");                                             
           tiempo.schedule(task,0,speed); 
    }
    //detiene la animacion
     public void stopAnimation() {        
        tiempo.cancel();
        task.cancel();
        run=false;
        System.out.println("La animacion fue detenida");                                             
    }
}

El funcionamiento de la clase animationclass.java es la de crear un jLabel, otorgarle mediante el constructor el tamaño del contenedor (jPanel) donde se lo colocara, el metodo setimage coloca mediante la propiedad seticon una imagen (de las 10 que se encuentran el package IMG) en el jlabel, el metodo encargado de la animacion es startAnimation(), el cual crea el timer correspondiente el cual ira incrementado la variable frame y hara un llamado al metodo setimage(), para actualizar la imagen del jLabel.

La aplicación terminada

El siguiente video muestra el resultado del proyecto, asi como tambien el diseño realizado con netbeans

Para bajar el proyecto y darle un vistazo al código y a la japo comiendo (Actualizado)
Click para descargar

5 comentarios:

  1. Excelente aporte! Estuve mucho tiempo buscando algo como esto para incluir una pequeña animación sin necesidad de componentes extras (flash, flex, etc.).
    Gracias a este ejemplo pude hacerlo en minutos, en mi caso simplemente adaptando el código para que se ejecute una sola vez la secuencia.

    Saludos,
    kbza

    ResponderEliminar
  2. Hola, gracias, estuve todo el dia buscando algo para rotar de imagenes, y al fin lo encontre gracias a ti.

    ResponderEliminar
  3. Hola disculpa q te moleste por si alcazo no tienes uno igual pero para rotar una imagen mediante matrices en netbeans 7.3

    ResponderEliminar
  4. Hola! Primeramente felicitarte por las explicaciones y por tu buen blog.
    Una consulta, como puedo hacer que se mueva de manera mucho mas lenta?
    Mas o menos 5-10 segundos por imagen

    ResponderEliminar