Cronometro en Java

Para implementar el cronometro hemos creado una ventana que contiene un label llamado "tiempo", en el cual vamos a mostrar el tiempo. Primero debemos hacer la clase "ejecutable" para ello anadimos "implements runnable" a la clase:

public class cronometro implements Runnable{

Debemos crear un metodo "run" para poder usar hilos, dentro de este, hay un ciclo infinito, que se detiene 1000 milisegundos (1 seg), e incrementa un uno el entero correspondiente a los segundos, cuando este es igual a 59 se aumentan los minutos, y cuando los minutos son iguales a 59 se aumentan las horas

int horas=0, minutos=0, segundos=0;

public void run() {
try
{
for(;;) {
if(segundos==59) { segundos=0; minutos++; }
if(minutos==59) { minutos=0; horas++; }
segundos++;

tiempo.setText(horas+":"+minutos+":"+segundos);

crono.sleep(1000); }
}
catch (InterruptedException e) { System.out.println(e.getMessage()); }
}

Usaremos hilos para manejar el tiempo, para declaramos un hilo global

Thread crono;

Y en el constructor de la clase iniciamos el hilo.

/** Creates new form cronometro */
public cronometro() {

initComponents();
crono = new Thread(this);
crono.start();
}

Y listo! tenemos un cronometro funcionando, podemos pararlo, pausarlo, etc solo es de usar la funcion apropiada.




Codigo Fuente:

/**
*
* @author ces ces2601[arroba]gmail.com
*/

import javax.swing.JFrame;

public class cronometro implements Runnable{

Thread crono;
javax.swing.JLabel tiempo = new javax.swing.JLabel();

/** Creates new form cronometro */
public cronometro() {
JFrame ventana = new JFrame("Cronometro");
ventana.add(tiempo);
ventana.setSize(150,100);
ventana.setVisible(true);

crono = new Thread(this);
crono.start();
}


int minutos=0, segundos=0, horas=0;
public void run()
{ try {
for(;;) {
if(segundos==59) { segundos=0; minutos++; }
if(minutos==59) { minutos=0; horas++; }
segundos++;

tiempo.setText(horas+":"+minutos+":"+segundos);
crono.sleep(1000); }
}
catch (InterruptedException e) { System.out.println(e.getMessage()); }
}

public static void main(String args[])
{
new cronometro();
}

}

20 comentarios:

  Anónimo

27 de enero de 2009, 14:45

Muchisimas gracias tio...me has sido de gran ayuda!!

  Anónimo

16 de marzo de 2009, 20:03

XZero says: Excelente thx!

  Ces

3 de abril de 2009, 21:46

Para servirles, es un gusto

  Anónimo

22 de junio de 2009, 10:13

como lo puedo detener?

  Ces

22 de junio de 2009, 22:05

Puedes usar distintos metodos asociados a la clase Thread por ejemplo

start() /* iniciar */
stop() /* pararlo */
sleep(intx) /* para pausarle x milisegundos */
interrup() /* Interrumpe ejecucion */
suspend() /* Suspender */
resume() /* reanudar */

Tambien podrias checar el estado:

isAlive() /* Para verificar si esta vivo */

Hay muchos metodos utiles te recomiendo el siguiente link:

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html

saludos

  Unknown

25 de julio de 2009, 17:12

man podrias ayudarme, veras el compilador me tira unos errores...

no runnable method
java.lang.exception
at java.lang.reflect.Constructor.newInterface(constructor.java:513)

te agradeceria que me dijeras q tipo de error es ese por q la verdad primera vez q me sale... yo utilizo netbeans 6.5.1 y necesito hacer un cronometro con precicion de a milisegundos para medir tiempos de ejecucion de programas, la parde de los milisegundos es facil yo la hago, pero necesito que me corra este normal, te agradeceria la respuesta gracias =)

  Unknown

25 de julio de 2009, 20:05

jeje amigo ya lo solucione, el problema al parecer era con el netbeans no se por q me tiraba esos errores, pero ya lo corri en eclipse y corre a las mil maravillas jeje gracias =)

  Michael

22 de agosto de 2009, 23:04

cuando llega a 59 tanto los segundos como los minutos se deberia de empezar desde -1 dado que luego se autoincrementa en uno y daria cero que es lo que se desea y no cuando llege a 59 se inicie en 0 y incremente a 1, por que cuando llega a por ejemplo 0:0:59 el proximo sria 0:1:1 en la JLabel checalo... me ayudo bastante =0)

  Anónimo

3 de marzo de 2010, 18:13

Como puedo hacer un cronometro como el tuyo, pero sin usar hilos.
Hice uno sin hilos y en el actionPerformed del boton iniciar genero el cronometro y ahi mismo lo muestro jTextField1.setText();
sin embargo muestra unicamente el ultimo valor que toma el cronometro, a pesar de que uso un Thread.sleep() para que segun yo se detenga y me de tiempo verlo. Gracias de antemano

  Marcelo

10 de agosto de 2010, 20:59

Buenas tengo un problema quiero implementar esto en un formulario o JFRAME pero cuadn coloco Thread. me da error utilizo netbeans. No se si es un error de netnbeans o mio. pero no se puede usar Thread. en un jframe? Gracias

  Ces

10 de agosto de 2010, 21:54

cual es el error? si te das cuenta esta implementado en un JFrame

  Marcelo

11 de agosto de 2010, 7:02

Bien el detalle es que yo utilizo Netbeans y Utilizo una Plantilla o JFrame. El netbeans te crea una clase del tipo o algo asi
public class Cronometro extends javax.swing.JFrame(Esta clase soporta los metodos como dispose() etc. el Runnable no. :))
Como veis mi clase no es del tipo implements Runnable . es por esa razon que no soporta Hilos o Thread pero Tu ejemplo es maravilloso Gracias. Ahora Voy a acceder a los datos desde otro Jframe del tipo extends javax.swing.JFrame . vere si no pierdo muchos milisegundos en capturar los valores de minutos y segundos. etc. Para despues poder Guardarlos en un BD. sI SABES COMO implententar Hilos en una clase extends javax.swing.JFrame te agradeceria .Pd Tu ejemplo me ayud mucho:)

  Ces

11 de agosto de 2010, 9:33

acá tienes el ejemplo: http://ces2601.blogspot.com/2010/08/cronometro-en-java-usando-netbeans.html,

saludos

  Anónimo

16 de abril de 2011, 5:58

Hola, gracias por el aporte, lo he probado y funciona, el problema es que cuando le das al stop, lo para pero si le das luego al play te salta un error.
Me gustaria poder hacer para el crono y poder empezarlo de 0.

Gracias

  Ces

20 de abril de 2011, 16:31

porque para eso sirve el boton "stop" si lo que deseas es pausarlo usa el boton de pausa, chequeate este ejemplo:

http://ces2601.blogspot.com/2010/08/cronometro-en-java-usando-netbeans.html

saludos

  Ed

3 de enero de 2012, 16:09

Este comentario ha sido eliminado por el autor.
  Anónimo

18 de junio de 2012, 10:42

Hola podrian ayudarme necesito que el reloj se vea en grande estoy usando jTextField lo pongo dentro del ciclo pero no me imprime nada hasta que termina el ciclo me imprime el final
este es el codigo que estoy utilizando:

time= Integer.parseInt(jTextField1.getText());

for(min=0; min<time; min++)
{
for(seg=0; seg<60; seg++)
{
display.setText(display.getText()+" "+seg);
delaySegundo();

}
}
JOptionPane.showMessageDialog(null,"Finalizo el tiempo");

}

private static void delaySegundo()
{
try{
Thread.sleep(1000);
}catch(InterruptedException e){}
}

  Anónimo

25 de marzo de 2013, 0:09

Excelente publicacion me ayudo mucho graciasir

  monse

27 de noviembre de 2020, 17:10

la verdad es que ,e sale un error
y no se como correjirlo

  monse

27 de noviembre de 2020, 17:11

public static void main(String args[]) {
{
new cronometro () ;
}
tengo un error aqui
es que me aparece ahi