Ir al contenido principal

Programar un reloj en Java


Logo Java
En algunas ocasiones dentro de nuestras aplicaciones es necesario contar con un reloj que muestre la hora en tiempo real, ya sea por que forma parte importante de la ejecución o simplemente es conveniente tenerlo de manera informativa.

En este caso abordaremos una solución para esta necesidad, en este tutorial crearemos una pequeña aplicación que se encargará única y exclusivamente de mostrar la hora del sistema, actualizándose segundo a segundo (en tiempo real). Pasemos a la explicación.




Crear el proyecto
  1. Creamos un nuevo proyecto en NetBeans de nombre Reloj.
  2. Una vez creado agregamos al paquete 'reloj' un JFrame dando clic derecho sobre el paquete > Nuevo > Formulario JFrame y le ponemos como nombre 'Principal'.
  3. Agregamos al frame una etiqueta que ocupe todo el espacio y posteriormente le cambiamos el nombre por 'lbHora'.
            JFrame con etiqueta

  4. Cambiamos el formato de tal manera que se ajuste a lo que deseamos ver en pantalla (tamaño de letra, tipo, estilo, alineación, color, etc)
Tras realizar estos pasos nos quedará algo parecido a lo siguiente:
JFrame con Jlabel modificado


Definir el comportamiento
  1. Nos vamos a la vista de Código Fuente del frame 'Principal' y en la definición de la clase indicamos que implementa la interfaz Runnable, esto debido a que tenemos que trabajar con hilos si queremos que nuestro reloj muestre la hora en tiempo real. 
    public class Principal extends javax.swing.JFrame implements Runnable{...

  2. Al realizar lo anterior el compilador nos indicará que es necesario implementar el método run(), así que lo agregamos de la siguiente manera:

    public void run(){
    ...
    }

  3. Ahora agregamos algunas variables a nivel de clase que nos vayan almacenando los valores principales de nuestra aplicación tal como se muestra a continuación:

    String hora,minutos,segundos,ampm;
    Calendar calendario;
    Thread h1;

    * Los objetos tipo String nos almacenarán lo que su nombre indica (la hora, minutos,segundos y si la hora es am o pm). 
    * El objeto calendario nos ayudará a realizar las operaciones necesarias con las horas. Debemos importar el paquete java.util.Calendar para evitar errores al definir este objeto.
     * El hilo h1 nos ayudará a actualizar la hora en tiempo real.

  4. Posteriormente agregaremos el método calcular() en el cual realizaremos los cálculos de la hora, tal como se muestra a continuación:

    public void calcula () {        
    Calendar calendario = new GregorianCalendar();
    Date fechaHoraActual = new Date();

    calendario.setTime(fechaHoraActual);
    ampm = calendario.get(Calendar.AM_PM)==Calendar.AM?"AM":"PM";
    
    
    if(ampm.equals("PM")){
     int h = calendario.get(Calendar.HOUR_OF_DAY)-12;
     hora = h>9?""+h:"0"+h;
    }else{
    hora = calendario.get(Calendar.HOUR_OF_DAY)>9?""+calendario.get(Calendar.HOUR_OF_DAY):"0"+calendario.get(Calendar.HOUR_OF_DAY);
    }
    minutos = calendario.get(Calendar.MINUTE)>9?""+calendario.get(Calendar.MINUTE):"0"+calendario.get(Calendar.MINUTE);
    segundos = calendario.get(Calendar.SECOND)>9?""+calendario.get(Calendar.SECOND):"0"+calendario.get(Calendar.SECOND);
    }

    * En este método lo primero que hacemos es inicializar el objeto calendario, posteriormente obtenemos la fecha y hora actuales en el objeto fechaHoraActual y establecemos dichos valores al objeto calendario. Posteriormente verificamos si la hora es AM o PM y lo almacenamos en el objeto ampm, en caso de ser PM restamos 12 horas (para que en caso de ser las 23 hrs nos lo indique en formato 9 pm). En caso de que la hora sea menor a 10 le concatenamos un cero a la izquierda para que se muestre la hora en 2 dígitos, lo mismo con los minutos y segundos.

  5. Una vez que tenemos lo anterior, agregamos el siguiente código al método run()...

    public void run(){
     Thread ct = Thread.currentThread();
     while(ct == h1) {   
      calcula();
      lbHora.setText(hora + ":" + minutos + ":" + segundos + " "+ampm);
      try {
       Thread.sleep(1000);
      }catch(InterruptedException e) {}
     }
    }

    * Lo que hacemos es obtener primeramente el hilo que se esté ejecutando actualmente y actualizar la hora en base al método calcular() que escribimos anteriormente mientras que el hilo actual sea el frame Principal, establecemos los valores obtenidos en el cálculo en la etiqueta que se encuentra en el frame, posteriormente pausamos la ejecución del hilo por un segundo y volvemos a realizar el cálculo y actualización de la hora.

  6. Ahora agregamos al constructor de la clase la inicialización del hilo y le indicamos que el frame sea visible en pantalla.

    h1 = new Thread(this);
    h1.start();
    setLocationRelativeTo(null);//para centrar la ventana
    setVisible(true);


  7. Por último, creamos una nueva instancia del frame Principal en la clase Reloj, dentro del método main...

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

Una vez hecho esto podemos ejecutar el proyecto y veremos cómo nos muestra la hora actual y va cambiando conforme pasa el tiempo.


Reloj en Java

Es importante tomar en cuenta que la hora que se muestra es la definida en el sistema operativo.

Puedes descargar el código fuente del proyecto de este tutorial desde el siguiente enlace...




¿Alguna duda o algo qué decir? Deja tu comentario. Saludox.

Comentarios

  1. Cual es el password?????

    ResponderBorrar
  2. El password es:
    http://monillo007.blogspot.com

    Saludox.

    ResponderBorrar
  3. Esta muy bien explicado y es exactamente lo que estaba buscando.
    Muchas Gracias!!! :-D

    ResponderBorrar
  4. Esta muy bien gracias viejo por la ayuda

    ResponderBorrar
  5. Bueno quise descargar el codigo fuente... y no me permite...

    ResponderBorrar
  6. amigo unA CONSULTA Y COMO LO ARIAS EN EL PROGRAMA JCREATOR .. E TRATADO PERO NO PUEDO .. SI PUDIERAS AYUDARME CHEBRE. Y DE ANTEMANO TE LO AGRADESCO..

    ResponderBorrar
  7. Qué tal,

    Te comento que el código es el mismo, solo debes adaptarlo a tu IDE, te recomiendo descargar el proyecto para que visualices todo y lo puedas ejecutar.

    Saludos.

    ResponderBorrar
  8. chebre gracias .. si funciono :D ..

    ResponderBorrar
  9. hola q tal ... amigo otra consulta a nosotros nos dan y plantilla q es esta :


    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*;

    public class Aa extends JApplet implements ActionListener {
    // Declaración de variables

    //-------------------------------------------------------------------
    // Crea la interfaz gráfica de usuario
    public void init() {

    }
    //--------------------------------------------------------------------
    // Procesa eventos de tipo ActionEvent
    public void actionPerformed( ActionEvent e ){

    }
    }

    pero al querer pasarlo a esta plantilla me confunde .. no se como ponerlo, pero tambien quisiera pasarlo a un JLabel para poder ponerlo en diferentes paneles .. y poder capturar la hora actual cuando ejecute un proceso, de ante mano te agradesco tu ayuda :D ..

    ResponderBorrar
  10. Muchas gracias!!! funciono muy bien!

    ResponderBorrar
  11. de donde puedo descargar el codigo del reloj no lo encuentro

    ResponderBorrar
  12. VIEJO MUCHAS GRACIAS DEBERIA HACERLOS MAS SEGUIDO ESTA MUY BIEN PARA NOSOTROS LOS QUE TODAVIA NO SABEMOS MUCHO DE ESTO

    ResponderBorrar
  13. Muchas gracias por el ejercicio, me fue de gran ayuda para entender mas sobre Hilos e implementarlos en proyectos anteriores.

    ResponderBorrar
  14. Gustavo:
    Monillo muchas gracias funciona perfecto.
    Tengo la sgte consulta:
    En un formUser tengo que mostrar la hora en tiempo real para eso hice la clase Reloj con el codigo que pusiste lo que ho he podido es pasarle a label del FormUser la hora del objeto de tipo Reloj. Si me puede orientar en como pasar la hra a ese nuevo formulario te agradezco inmensamente.
    Nuevamente gracias

    ResponderBorrar
  15. que bueno q hayan personas q nos puedan ayudar muxas gracias!!!

    ResponderBorrar
  16. excelente si funciona!!!...amigo quiero q me ayudes con un codigo para cedula son 10 digitos..please gracias

    ResponderBorrar
  17. huy parce que facil lo hizo ...lo unico que me parece raro y es por qeu no lo he visto es lo de los hilos...pero ya investigare...muchas gracias

    ResponderBorrar
  18. Qué tal Juan,

    Aquí en el blog hay tutoriales sobre hilos por si te quieres dar una vuelta:

    Link

    Saludos.

    ResponderBorrar
  19. gracias me parece muy bueno esta full fino era lo que estaba buscando un millon de gracias

    ResponderBorrar
  20. saludos alguien me podria decir como hacer un reloj
    pero con check box en un jframe

    saludos y gracias.

    ResponderBorrar
  21. Holle amigo como le modifico el codigo a reloj si quiero que me muestre por ej. en ves de 05:00 pm que me muestre las 17:00 pm. porfa dime en donde y como.

    ResponderBorrar
  22. Alguien sabe si se le puede introducir Audio?
    Por ejemplo que reprodujera un tono cada hora con .wap
    Gracias

    ResponderBorrar
  23. disculpa mi ignorancia soy nuevo en esto pero me gustaria saber como le haria para cuando le de detener al tiempo y luego volver a iniciar no me tire error... de antemano muchas gracias por los datos.

    ResponderBorrar
  24. Excelente, bueno y sencillo gracias por el aporte...

    ResponderBorrar
  25. No puedo deescargar tu ejemplo desde la página
    http://i.minus.com/1358604796/sed8MtPG8swQOxBc2wH-ew/dcb9fq/Reloj19.07.2011.rar

    Tienes algún otro sitio. SkyDrive, Dropbox, GoogleDrive, Box, MegaCloud, MediaFire, DepositFile, etc

    Gracias

    ResponderBorrar
  26. Amigo puedes volver a subir el link por favor ya no funciona :(

    ResponderBorrar
  27. Amigo puedes volver a subir el link por favor ya no funciona

    ResponderBorrar
  28. mira ninguna link sirve... no puedo descargar nada de la pagina, me puedes ayudar te lo agradecería men

    ResponderBorrar
  29. Qué tal Omar,

    Algo está pasando con el servidor de alojamiento que estoy utilizando, en un rato más arreglo los links para que no tengas problemas.

    Saludos.

    ResponderBorrar
  30. Listo Omar, ya puedes descargar el proyecto.

    ResponderBorrar
  31. gracias pana x resolver el problema y ya descargue el proyecto

    ResponderBorrar
  32. Excelente aportación, la descargue y adapte a mi proyecto y funciona muy bien, muchas gracias. Ojala y también lo hagas en vídeo tutoriales.

    ResponderBorrar
  33. Gracias, andubo impecable

    ResponderBorrar
  34. hola Luis ningun link sirve... no se puede descargar el prog, me puedes ayudar te lo agradecería mucho, gracias

    ResponderBorrar
  35. Felicidades, muy buena explicación. Gracias por este tipo de aportes.

    ResponderBorrar
  36. Hola, que tal
    Primero y antes que nada quiero felicitarte por tu blog, es muy bueno
    En segunda, en la Universidad me dejaron un proyecto en el cual tengo que desarrollar un sistema para el control de vuelos de un aeropuerto, para el cual quería utilizar un reloj, utilice el código que tu desarrollaste, pero quisiera ver si me pudiera ayudar en que por medio de un spinner o de un boton, la hora se acelere, para que vaya mas rápido el tiempo, que el usuario decida que tan rápido quiere que avance la hora, espero que haya podido explicarme, espero puedas escribirme a mi correo alesx.rdz@hotmail.com, de antemano muchas gracias
    Buen día

    ResponderBorrar
  37. Muy buen aporte amigo es lo que estaba buscando me va servir mucho para mi proyecto =D

    ResponderBorrar
  38. Muchas Gracias Estoy Desarrollando un Pequeño Punto de Venta.
    Y Queria que mi Ventana Tuviera un Reloj de Esta Manera.
    Gracias.

    ResponderBorrar
  39. Exelente aportacion, es justamente lo que estaba buscando, (y)

    ResponderBorrar
  40. Excelente tutorial, pero necesito otra ayuda, he tratado de hacer lo mismo con javafx scene builder 1.1 y netbeans, pero no me funciona, seria posible que nos dieras un ejemplo como se implementaria en esta herramienta de javafx 1.1 scen builder?

    gracias felicitaciones.

    ResponderBorrar
  41. en javafx estoy tratando de implementar un sistema de punto de venta, pero incursione en javafx, y me he estancado que no hay un componente donde pueda colocar la hora y fecha, toca hacer el codigo, pero segui tus instrucciones con java y me funciono pero no he podido enlazar la vista con con el contrallador (javafx 1.1. scene builder)
    te agradeceria mucho si me ayudaras.

    Yesid Calle

    ResponderBorrar
  42. Hola, perdona mi insistencia, pero me gustaria que me ayudaras de como implementar tu reloj en javaFX, cuando creo un proyecto javafx FXML application, el me crea, el reloj.java, el controlador.java y la vista relovista.fxml, y no se como implementarlo.

    Por favor ayudame, no puedo crer que una aplicacion como esta no tenga un control de reloj, o si exite no se donde encontrarlo, por lo menos en Netbeans hay una paleta de Edinsoncor que existe un digitalclock. y estoy completmenta varado.

    ResponderBorrar
  43. hola muy buen tutorial me puedes ayudar o donde puedo descargar el código tengo un problema

    ResponderBorrar
  44. Hola!!! muy buena explicacio! muchas gracias!!..saludos! :D

    ResponderBorrar
  45. Muuuuchas gracias men me sirvió a la primera :)!!

    ResponderBorrar
  46. Gracias, necesitaba hacer una toolbar con fecha y hora, solo habia que realizar el codigo dentro de un jpanel en lugar de jframe, y añadir algo de codigo para mostrar la fecha. Ah!, y en lugar de obtener la fecha del sistema necesitaba la del servidor mysql. Tu codigo me fue de gran ayuda.

    ResponderBorrar
  47. muchas gracias hermano, voy a probar a ver que tal. saludos.

    ResponderBorrar
  48. hola, gracias por compartir coodigo, estoy hacieeendo una maaquina del tiempo y me sirviooo para repasar java X3, pues casi no lo puedo recordar bien. T-T

    ResponderBorrar
  49. el código genera un erro en el Date de:

    Date fechaHoraActual = new Date();
    calendario.setTime(fechaHoraActual);

    lo arregle sustituyendo esa dos lineas con:

    calendario.setTime(java.util.Date.from(Instant.now()));

    ResponderBorrar
  50. Buenas Noches, el código me sirve bastante solo que me di cuenta de un detalle
    cuando son 12 PM muestra
    que son 00 PM.
    Mi pregunta es un error o tiene alguna llave de más abierta?

    ResponderBorrar
    Respuestas
    1. ya resolví, edite una linea y le agregue unas lineas de código y listo resuelto el detalle, esto fue lo que hice:

      int h=calendario.get(Calendar.HOUR_OF_DAY);
      if(h>12)
      {
      h=h-12;
      }else
      h=h-0;
      hora = h>9?""+h:"0"+h;

      Borrar
    2. Excelente lo del error de 12 pm es algo a tener en cuenta

      Borrar

Publicar un comentario

Este es un espacio abierto, puedes escribir lo que gustes respetando los siguientes puntos:

1.- Lo que escribas esté relacionado con el post, si gustas contactarme puedes hacerlo aqui.

2.- Todo es cuestionable, aunque ten en cuenta que existen formas de hacerlo, evita las agresiones y revisa tu lenguaje antes de publicar un comentario.

3.- Siempre hay tres verdades: tu verdad, mi verdad y la verdad, por lo que opiniones diferentes no necesariamente son equivocadas.

4.- Los comentarios son una forma de discusión abierta, por lo que al publicar uno, implícitamente entras a una discusión, con todo lo que esto representa.

5. Me reservo el derecho de eliminar comentarios que no respeten las condiciones mencionadas anteriormente.

Toma en cuenta que puedes utilizar emoticones en tu comentario, para ver una lista de los disponibles da clic en este enlace.

Entradas más populares de este blog

3 sencillos pasos para tramitar la ayuda por desempleo de la AFORE

¿Tienes dinero ahorrado en tu AFORE y en este momento no estás trabajando o estás trabajando pero no tienes seguro social? Si respondiste sí a la pregunta anterior entonces hay una buena noticia para ti: puedes retirar una parte del dinero que tienes ahorrado. Y lo mejor, es muy sencillo. En este artículo te diré paso a paso qué hacer para obtener ese dinero, sin tecnicismos legales ni nada por el estilo, simple y sencillamente lo que necesitas saber. Paso Número 1: Obtener los últimos 2 estados de cuenta de tu Afore Esto en la mayoría de los casos es sumamente sencillo ya que dichos estados de cuenta llegan directamente al domicilio del ahorrador, si este es tu caso puedes saltar lo restante en este punto y continuar con el paso número 2, en caso contrario sigue leyendo… Si no tienes tus estados de cuenta debes ponerte en contacto con la empresa encargada de administrar tu ahorro para que te los proporcione, normalmente te van a pedir una identificación oficial, comprobante de

Conectar una base de datos en MySQL con NetBeans

NetBeans es una plataforma para el desarrollo de aplicaciones de escritorio usando Java y a un Entorno integrado de desarrollo (IDE) desarrollado usando la Plataforma NetBeans. Si eres un programador y desarrollas tus aplicaciones en Java seguramente necesitarás conectar una base de datos tipo MySQL a este entorno algún día, bueno, si lo necesitas ahora, he aquí una explicación paso a paso de cómo conectar ambas herramientas.

4 extraordinarias aplicaciones espía para Android

Le andas haciendo al James Bond y necesitas grabar video, voz o tomar fotos desde tu dispositivo Android sin ser notado? Aquí 4 excelentes aplicaciones que facilitarán tus hazañas de 007 en menos de lo que canta un gallo.

c606 c6nf5g4r6 e3 tec3ad6 [Como configurar el teclado]

¿Problemas al escribir con el teclado? ¿Tratas de escribir la letra ‘o’ y sale el número ‘6’ o algo por el estilo? La solución puede ser más simple de lo que parece. La solución a tu problema tras el salto...

Conexión, consulta y ejecución de sentencias en MySQL con Java

Anteriormente escribí este mismo artículo pero para bases de datos en Oracle . En este artículo prácticamente me copio y pego para explicar paso a paso cómo realizar la conexión a MySQL en Java, así como la forma de realizar consultas a los registros existentes y ejecutar sentencias de inserción, borrado y actualización de datos. Al final del artículo tendremos una clase que encapsulará todos los procedimientos necesarios para trabajar con la base de datos.