Calendar |
||||||
Archivos necesarios: |
||||||
En este trial vamos a ver cómo utilizar la clase Calendar que nos proporciona Java para hacer un calendario en el que podamos ver el día de hoy y nuestro cumpleaños. La clase Calendar tiene una gran cantidad de métodos que nos permiten obtener información sobre la fecha que representa el objeto. El control que vamos a crearen el trial es utilizado en agendas u organizadores de tiempo como Outlook, Google Calendar o Kontact pero podemos modificarlo para permitirle al usuario introducir una fecha de entrega de un producto o para que seleccione los limites de tiempo en una consulta. El archivo incluido en este trial es una versión del programa termiando con todos los archivos necesarios para ejecutarlo. |
||||||
¿Cómo utilizar el calendario? |
||||||
| Lo primero que debemos hacer antes de comenzar a codificar es pensar en qué información necesitamos para poder desplegar nuestro calendario. Vamos a ver un ejemplo de Google Calendar para pensar en qué cosas son realmente necesarias. | ||||||
|
Viendo la imagen de la izquierda nos damos cuenta que los siguientes datos son indispensables para poder crear nuestro calendario:
|
|||||
| Sabiendo los datos que necesitamos obtener vamos a irlos consiguiendo poco a poco utilizando la clase Calendar y algunos trucos. Crea una nueva aplicación de Java con una clase que se llame Main y pon el siguiente código para empezar: | ||||||
En el código vamos a crear una ventana que tenga un JLabel de título y después muestre un arreglo de JLabel que contengan los días. En este código estamos definiendo varios arreglos. Estos arreglos nos permiten guardar algunos datos que no podemos obtener del Calendar. El primer arreglo incluye los nombres de los días de la semana (para poder automatizar utilizando ciclos, eso lo vemos más adelante), después creamos un arreglo con los nombres de los meses y por último creamos un arreglo con el número de días que tiene cada mes. Esta información la ponemos nosotros porque es "información conocida", es decir, los nombres de los meses no cambian dependiendo del día seleccionado. Otra cosa importante que hay que notar es que el constructor de la clase recibe dos parámetros. El primero es el número de mes y el segundo es el año que se deben desplegar en el calendario, esto para permitir que podamos mostrar diferentes meses. Una vez que ya creamos la inicialización es necesario empezar a obtener los datos del calendario. Para obtener información del calendario regularmente utilizamos el método get() que recibe el campo que queremos obtener. Por ejemplo, tomando en cuenta que tuvieramos un objeto Calendar llamado cal, para obtener el mes podemos utilizar: cal.get(Calendar.MONTH); Ahora pon el siguiente código que nos va a permitir obtener los datos del Calendar dentro del método Main(): |
![]() |
|||||
![]() |
En este código estamos declarando varias variables.
Después de declarar las variables creamos dos GregorianCalendar. Esta clase es una subclase de Calendar y por lo tanto hereda toda su funcionalidad y lo expande con varios métodos muy útiles, como por ejemplo isLeapYear() que nos permite saber si un año es biciesto. El primer GregorianCalendar currCal lo estamos iniciando con elmétodo getInstance() de la clase Calendar. Este método nos devuelve un objeto Calendar que tiene la fecha de hoy, como el Calendar no es directamente compatible con GregorianCalendar tenemos que hacer un cast.. |
|||||
El segundo GregorianCalendar lo estamos iniciando con un constructor que recibe el año, el mes y el día que va a representar. Es importante fijarnos que el día que pasamos como parámetro es el día primero, esto lo hacemos para que más adelante saquemos en qué día de la semana cae el día primero. Después de eso comparamos si el mes y año de los dos Calendar son iguales, lo que significaría que el mes que vamos a pintar es el mes actual y por lo tanto debemos dibujar el día de hoy de un color diferente para representar que es hoy. En este caso, la variable today tendría como valor el número de día en caso de que sea el mes actual o cero en caso contrario, esta regla que pusimos es importante recordarla para que más adelante al crear la interfaz la sigamos. Después obtenemos el número de días del arreglo que creamos con el número de días por mes y, en caso de que el año sea biciesto y el mes que estamos dibujando sea febrero le sumamos uno al número de días. Por último obtenemos el día de la semana en el que empieza el mes (0 para domingo, 1 para lunes, 6 para sábado). Después de esto inicia la interfaz. El layout de la ventana es un BorderLayout, en la parte norte hay un JLabel que tiene el nombre del mes y el año (el mes puedes obtenerlo del arreglo months[] utilizando la variable month que recibe el constructor) y para crear el arreglo de JLabel que va a tener los días copia el siguiente código: |
||||||
Este código está dividido en tres ciclos. El primer ciclo sirve para poner los nombres de los días, el segundo ciclo sirve para poner el espacio en blanco antes de que inicie el mes y el tercer ciclo sirve para poner los días. Vamos a ver el primer ciclo, primero que nada hay que notar que estamos utilizando una variable de control n, esta variable la utilizamos para que, en caso de que en el lugar en que corra el programa la semana empiece en lunes, los días queden bien puestos. Para conseguir esto dentro del ciclo utilizamos la instrucción days[n++ % 7]. El operador modulo (%) nos devuelve el residuo que resultaría de dividir n/7, utilizar este operador para que una vez que obtenemos la última posición del arreglo volvamos a empezar por la primera es una estrategia muy común en programación. Después de eso creamos un JLabel de la manera que ya conocemos y le cambiamos el tipo de letra y lo centramos para que sea más elegante. |
![]() |
|||||
El segundo ciclo va a crear offset espacios en blanco dentro del calendario. Si te fijas, para crear un espacio en blanco estamos utilizando un JLabel que no tiene ningún texto y lo agregamos enseguida al JPanel de días. El tercer ciclo es el que agrega los días. El ciclo va a iniciar todos los JLabel de lblDays y luego va a centrarlos y ponerles un borde para que se vean elegantes. Después de los tres ciclos cambiamos el color del fondo del JPanel para que se vea más similar a un calendario y por último agregamos el panel a la ventana. Hasta este punto nuestra aplicación ya tiene la mayor parte de la funcionalidad que buscabamos, lo único que falta es que en caso de que sea nuestro cumpleaños dibuje un pastel y en caso de que sea el día de hoy cambie el color a rojo. Esto podemos lograrlo agregando un if en el ciclo que crea los JLabel de los días (el tercero). Copia el siguiente código dentro de este ciclo después de cambiar el borde pero antes de agregar el control al panel: |
||||||
![]() |
En este código estamos comparando el valor de i+1 (el número de día en el tercer ciclo) con los valores que queremos revisar, por ejemplo, para cambiar el color del día cuando es el día de hoy revisamos si i+1 es igual a today (que es la variable en que guardamos el día siempre y cuando el mes y año fueran el actual). En este caso la funcionalidad es muy limitada, pero podríamos implementar una función que devolviera diferentes valores dependiendo del tipo de día que es (por ejemplo, que devuelva 0 para días normales, 1 para cumpleaños, 2 para el día de hoy) y luego en lugar de estos if utilizar un switch para modificar el JLabel como sea necesario. La última cosa importante que hay que notar es que en caso de que cambiemos el color debemos utilizar el método setOpaque() para obligar al JLabel a pintar su color de fondo. |
|||||
|
||||||