domingo, 28 de agosto de 2011

Uso de un timer en java (Temporizadores)





Como se puede programar una tarea repetitiva y automática en un aplicativo tipo Swing de java?


La idea es generar una aplicación con una etiqueta que usaremos como display del contador y tres botones con las acciones de iniciar, parar y reset.

El contador se mantendrá contando una ves pulsemos el botón Iniciar y solo se detendrá al pulsar el botón Parar; si pulsamos el botón Reset su contador debe regresar a cero.

Para este fin utilizaremos la clase Timer de java.util, entonces nuestros imports quedaran de la siguiente manera:

import java.awt.*;

import java.awt.event.*;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;

Para poder manejar una tarea de manera automática y repetitiva debemos sobre-escribir el método run de la clase TimerTask; para esto crearemos una clase interna que llamaremos RemindTask y nuestro método run quedara como sigue:

class RemindTask extends TimerTask {
public void run() {
segundos++;
lblTime.setText(String.valueOf(segundos));
if(frozen){
  System.out.println("Terminamos la ejecucion del timer");
  timer.cancel();
}
}
}

Este método lo único que hace es incrementar una variable segundos y cargar este valor en el display de nuestro contador. Recuerden que dijimos que era una clase interna, así que se debe declarar dentro del cuerpo de la clase de la interfaz gráfica con lo que el código total queda de la siguiente manera:

public class AppContadorSwing implements ActionListener{
JFrame frame;
JPanel panel;
JButton btnIniciar,btnParar,btnReset;
JLabel lblTime;
Timer timer;
int segundos;//manejar el valor del contador
boolean frozen; //manejar el estado del contador

public AppContadorSwing() {
frame = new JFrame("Contador Swing");
panel = new JPanel(new GridLayout(1,3));
btnIniciar = new JButton("Iniciar");
btnIniciar.addActionListener(this);
btnParar = new JButton("Parar");
btnParar.addActionListener(this);
btnReset = new JButton("Reset");
btnReset.addActionListener(this);
lblTime = new JLabel("0",SwingConstants.CENTER);

panel.add(btnIniciar);
panel.add(btnParar);
panel.add(btnReset);

frame.getContentPane().add(lblTime, BorderLayout.NORTH);
frame.getContentPane().add(panel, BorderLayout.SOUTH);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.pack();
frame.setVisible(true);

frozen = true; //iniciamos el estado en congelado
segundos = 0;
}

//clase interna que sobre-escribe el metodo run de TimerTask
class RemindTask extends TimerTask {
public void run() {
  segundos++;
  lblTime.setText(String.valueOf(segundos));
  if(frozen){
      System.out.println("Terminamos la ejecucion del timer");
      timer.cancel(); //detenemos el timer
  }
}
}

public void actionPerformed(ActionEvent a) {
System.out.println(a.getActionCommand());
if(a.getActionCommand().equals("Iniciar")){
  frozen = false;
  timer = new Timer();
  //le asignamos una tarea al timer
  timer.schedule(new RemindTask(),0, 1*100);
}
if(a.getActionCommand().equals("Parar")){
  frozen = true;
}
if(a.getActionCommand().equals("Reset")){
  frozen = true;
  segundos = 0;
  lblTime.setText(String.valueOf(segundos));
}
}

public static void main(String[] args){
JFrame.setDefaultLookAndFeelDecorated(true);
AppContadorSwing c = new AppContadorSwing();
}
}

1 comentario:

Nuevo Sitio

Este sitio ya no se actualizara mas, nos mudamos a IpArea.NET




Articulos Relacionados