## Cómo usar Timers

La clase Timer dispara uno o más ActionEvent después de un retardo especificado. Los temporizadores son útiles en las siguientes situaciones:

1. Hacer algo después de un retardo. Por ejemplo, muchos componentes Swing, como los botones, usan un temporizador para determinar cuando mostrar un tool-tip.
2. Mostrar progresos periódicamente. El prmer ejemplo que siguie, ProgressBarDemo, hace esto.
3. Realizar animaciones. Puedes ver Usar un Temporizador para Realizar Animaciones más adelante en esta página.

VEamos un ejemplo de la situación número 2. Aquí hay una imagen de una pequeña aplicación de ejemplo que usa un Timer y una barra de progreso para mostrar el progreso de una tarea de larga duración.

> Prueba esto:
> 1. Compila y ejecuta la aplicación. El fichero principal es ProgressBarDemo.java.
> 2. Pulsa el botón Start. Mira la barra de progreso mientras la tarea se completa.

Una vez que la tarea ha empezado, el temporizador hace que la barra de progreso se actualice cada segundo hasta que la tarea se haya completado. Aquí está códio de ProgressBarDemo.java que crea el temporizador y, cuando el usario pulsa el botón Start, lo arranca:

    timer = new Timer(ONE_SECOND, new TimerListener());
    . . .
    timer.start();

Abajo está el código que implementa el oyente de action que es notificado cada vez que el temporizador va a cero:

    class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent evt) {
            progressBar.setValue(task.getCurrent());
            if (task.done()) {
    	    Toolkit.getDefaultToolkit().beep();
    	    timer.stop();
    	    startButton.setEnabled(true);
            }
        }
    }

La línea en negrita del código para el temporizador cuando la tarea se ha completado.

> Nota: El método actionPerformed definido en el oyente de action del Timer es llamado en el thread de despecho de eventos. Esto significa que nunca tenemos que usar el método invokeLater sobre él. Para más información sobre el uso de componentes Swing y threads en el mismo programa, puedes ver Threads y Swing.

#### Usar un Timer para Realizar Animaciones

> Aquí hay un ejemplo de uso de un Timer para implementar un bucle de animación:

>     public class AnimatorApplicationTimer extends JFrame implements ActionListener {
>         ...//where instance variables are declared:
>         Timer timer;

>         public AnimatorApplicationTimer(...) {
>             ...
>             // Set up a timer that calls this
>             // object's action handler.
>             timer = new Timer(delay, this);
>             timer.setInitialDelay(0);
>             timer.setCoalesce(true);
>             ...
>         }

>         public void startAnimation() {
>             if (frozen) {
>                 // Do nothing.  The user has
>                 // requested that we stop
>                 // changing the image.
>             } else {
>                 //Start (or restart) animating!
>                 timer.start();
>             }
>         }

>         public void stopAnimation() {
>             //Stop the animating thread.
>             timer.stop();
>         }

>         public void actionPerformed (ActionEvent e) {
>             //Advance the animation frame.
>             frameNumber++;

>             //Display it.
>             repaint();
>         }
>         ...
>     }

> Puedes encontrar el programa completo en AnimatorApplicationTimer.java.

#### El API de Timer

> Las siguiente tablas listan los métodos y constructores más usado de Timer. El API para usar temporizadores de divide en tres categorías:
> - Ajuste Fino de la Operación del Timer
> - Ejecutar el Timer
> - Escuchar el Disparo del Timer

> Ajuste fino de la Operación del Timer
> Método o Constructor | Propósito
> --- | ---
> Timer(int, ActionListener) | Crea un timer inicializado con un retardo y un oyente. Este es el único constructor de Timer.
> void setDelay(int) int getDelay() | Selecciona u obtiene el retardo entre disparos.
> void setInitialDelay(int) int getInitialDelay() | Selecciona u obtiene el retardo para el disparo inicial.
> void setRepeats(boolean) boolean isRepeats() | Selecciona u obtiene si el timer se repite.
> void setCoalesce(boolean) boolean isCoalesce() | Selecciona u obtiene su el timer junta varios disparos pendientes en un único disparo.

> Ejecutar el Timer
> Método | Propósito
> --- | ---
> void start() void restart() | Activa el timer. restart cancela cualquier disparo pendiente.
> void stop() | Desactiva el timer.
> boolean isRunning() | Obtiene si el timer se está ejecutando.

> Escuchar el Disparo del Timer
> Método | Propósito
> --- | ---
> void addActionListener(ActionListener) void removeActionListener(ActionListener) | Añade o elimina el oyente de action.

#### Ejemplos que usan Timer

> Esta tabla meustra algunos de los ejemplos que usan Timer y dónde se describen.

> Ejemplo | Dónde se describe
> --- | ---
> ProgressBarDemo.java | Esta página y Cómo usar Monitor Progress
> AnimatorApplicationTimer.java | Esta página.
> SliderDemo.java | Cómo usar Sliders

Ozito