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.

49 comentarios:

  1. Anónimo dijo...:

    Cual es el password?????

  1. Monillo007 dijo...:

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

    Saludox.

  1. Anónimo dijo...:

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

  1. Anónimo dijo...:

    Esta muy bien gracias viejo por la ayuda

  1. zayda dijo...:

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

  1. Luis Navarro dijo...:

    Qué tal,

    Inténtalo con este link: http://min.us/mb8WyfN#3o

    Saludox.

  1. Anónimo dijo...:

    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..

  1. Luis Navarro dijo...:

    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.

  1. Anónimo dijo...:

    chebre gracias .. si funciono :D ..

  1. Anónimo dijo...:

    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 ..

  1. Zazie dijo...:

    Muchas gracias!!! funciono muy bien!

  1. Anónimo dijo...:

    de donde puedo descargar el codigo del reloj no lo encuentro

  1. Anónimo dijo...:

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

  1. Anónimo dijo...:

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

  1. Anónimo dijo...:

    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

  1. Anónimo dijo...:

    que bueno q hayan personas q nos puedan ayudar muxas gracias!!!

  1. Anónimo dijo...:

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

  1. Juan Patiño dijo...:

    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

  1. Luis Navarro dijo...:

    Qué tal Juan,

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

    Link

    Saludos.

  1. Anónimo dijo...:

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

  1. Anónimo dijo...:

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

    saludos y gracias.

  1. 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.

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

  1. Anónimo dijo...:

    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.

  1. Anónimo dijo...:

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

  1. RjveraL dijo...:

    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

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

  1. Omar Ibarra dijo...:

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

  1. Omar Ibarra dijo...:

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

  1. Luis Navarro dijo...:

    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.

  1. Luis Navarro dijo...:

    Listo Omar, ya puedes descargar el proyecto.

  1. Omar Ibarra dijo...:

    gracias pana x resolver el problema y ya descargue el proyecto

  1. Alex PP dijo...:

    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.

  1. Anónimo dijo...:

    Gracias, andubo impecable

  1. Anónimo dijo...:

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

  1. Anónimo dijo...:

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

  1. Anónimo dijo...:

    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

  1. German Gantiva dijo...:

    Muy bueno bien explciado

  1. Ricardo dijo...:

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

  1. Victor dijo...:

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

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

  1. Unknown dijo...:

    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.

  1. Unknown dijo...:

    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

  1. Unknown dijo...:

    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.

  1. lourdes reyes dijo...:

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

  1. Anónimo dijo...:

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

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.

 
Monillo007 © 2010 | Designed by Trucks, Manual Bookmarking | Elegant Themes