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

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:
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:
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();
}
}
Muy util el ejemplo, gracias
ResponderEliminar