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.

40 comentarios:

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