domingo, 11 de agosto de 2013

Calendario Gregoriano


LA NECESIDAD DE MEDIR EL TIEMPO
La historia dice que el ser humano desde que tuvo conciencia de la existencia del universo, vio la necesidad de medir el tiempo y tomando como base el día y la noche ideo los calendarios como los sistemas para medir el tiempo. Aunque la base física de medida del tiempo es el día y la noche; el principio para la elaboración de los calendarios se basa en las influencias que los movimientos de la tierra tienen en los estados del sol y de la luna.
De acuerdo a los principios de los movimientos de la tierra el ser humano (hombres y mujeres) en diferentes culturas idearon sus propios calendarios. Así por ejemplo, en la cultura Babilónica existió el calendario babilónico y se componía de doce meses de treinta días. Este calendario tuvo el inconveniente que con el trascurrir del tiempo las fases de la luna no coincidían con las fechas que señalaban el calendario, el desfase entre los estados de la luna y el calendario babilónico era de 5 días  y ¼ de día. La cultura griega ideo un calendario de doce meses de 29 y 30 días en forma alterna y agregaban un nuevo mes cada tercero, sexto y octavo mes. Esta propuesta de calendario no resulto práctica.  Hacia el siglo VII antes de Cristo los romanos idearon un calendario de diez meses que en total sumaban 304 días y el año comenzaba en marzo. Este calendario propuesto por los romanos con el tiempo se desfasaba en los ciclos de las estaciones. En este mismo siglo VII durante el reinado del rey Numa Pompilio se le añadieron dos nuevos meses, Enero y Febrero. Sin embargo la introducción de estos dos nuevos meses no se corrigió el desfase. Para corregir los errores del calendario romano Julio Cesar estableció un nuevo calendario que entró en vigencia el primero de enero del año 45 antes de Cristo. El calendario juliano se basaba en el año egipcio que tenía 365 días y un cuarto de día. Y para este cuarto de día cada cuatro años se le agregaba un día más al mes de febrero, aquí se origina los años bisiestos. Posteriormente por una errada interpretación se decidió que los años bisiestos fueran cada tres años lo cual condujo a un desfase de nuestra era, después de Cristo. En el año de de 1477 había un desase con los ciclos de las estaciones  y esto afectaba a la celebración de la Pascua y Resurrección y otras fiestas cuyas fechas dependían de esta fiesta. Para corregir todos estos inconvenientes que originaban este desfase el papa Gregorio XIII nombró una comisión para revisar el calendario juliano y de acuerdo al informe de esta comisión en marzo de 1582, el papa Gregorio XIII abolió el calendario juliano e introdujo un nuevo calendario, llamado posteriormente el calendario gregoriano actualmente seguido por la gran mayoría de cultura del mundo.
EL CALENDARIO GREGORIANO
El calendario gregoriano se estableció el 4 de octubre de 1582 del calendario juliano fue adoptado la mayoría de los países católicos. El calendario gregoriano divide el año en doce meses y comienza el primero de enero. El número de días que tiene cada mes es de 30 días para los meses de abril, junio, septiembre y noviembre; y 31 días para los meses de enero, marzo, mayo, julio, agosto, octubre y diciembre; y febrero 28 días con excepción de los años bisiestos que tiene 29 días.  
Lista ordenada de meses del año será:
<Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre>
Si enumeramos los meses como:
 
<Enero = 1, Febrero = 2, Marzo = 2, Abril = 4, Mayo = 5, Junio = 6, Julio = 7, Agosto = 8, Septiembre = 9, Octubre = 10, Noviembre = 11, Diciembre = 12>
Para la configuración del calendario de un mes los días se agrupan en semanas de siete días. Una semana se representa por la lista ordenada:
<Domingo, Lunes, Martes, Miércoles, Jueves, Viernes, Sábado>
De acuerdo a esto podríamos decir que el calendario de un mes se construiría sobre una matriz de seis filas por siete columnas. A continuación se muestra un ejemplo del calendario de un mes de 31 días y el día primero cae en sábado.

Figura 1. Matriz configuración de un calendario mensual









 



Para elaborar un calendario de un mes cualquiera de un determinado año se debe tener en cuenta lo siguiente:
1.       El número de días que tiene el mes
2.       El día de la semana del día primero del mes
 
Para el número de días del mes se analiza si el mes tiene 30, 31, 28 o 29 días. Un mes tiene 30 días se pertenece al subconjunto <Abril, Junio, Septiembre, Noviembre>. Un mes tiene 31 días si pertenece al subconjunto <Enero, Marzo,  Mayo, Julio, Agosto, Octubre, Diciembre> y 28 0 29 si es febrero. El mes de febrero tiene 29 días si el año es bisiesto o 28 si no es bisiesto. Desde el punto de vista matemático un año es bisiesto si es divisible por 4 excepto los divisibles por 100 al menos que se divisible por 400.

ALGORITMO PARA HALLAR LOS AÑOS BISIESTOS
Un año es bisiesto si es verdadera la siguiente expresión lógica:

esBisiesto = ((año mod 4) = 0) ν ((año mod 100) ≠ 0 ˄ (año mod 400)  = 0)

El algoritmo para programar el método que realiza la tarea de averiguar si un determinado años es bisiesto o no, es como sigue:

 esPrimo( año:int) : boleano
    Evaluar expresión ((año mod 4) = 0) ν ((año mod 100) ≠ 0 ˄ (año mod 400)  = 0)
    Si valor expresión es verdadero entonces el año es bisiesto
        De lo contrario el año no es bisiesto
  Fin del algoritmo

Algoritmo para hallar el número de días que tiene un determinado mes

El método en java que implementa el algoritmo será como el que se presenta a continuación:

public static boolean esBisiesto(int año){
        return (año%4==0)||((año%100!=0)&&(año%400==0));
 }

Este algoritmo es válido para un año mayor o igual 1583. Para mayores de este corresponde a otros calendarios, diferentes al calendario gregoriano. Entonces una instrucción válida en java para saber si es bisiesto o no, puede ser como la siguiente:

 if(esBisiesto(año)) System.out.println(“Es bisiesto”) else System.out.println(“No es bisiesto”);

  ALGORITMO PARA HALLAR EL NÚMERO DE DÍAS QUE TIENE UN DETERMINADO MES
Para calcular el número de días que tiene un determinado mes se procede de la siguiente manera:
  1. Se analiza si el mes dado es febrero y en el caso que lo fuera se averigua si el año es bisiesto y si lo es entonces el mes tiene 29 y si el año no es bisiesto entonces el mes tiene 28 dias.
  2. En el caso que no sea febrero se analiza si el mes dado está en el subconjunto de los meses que tienen 30 días y en el caso que se encuentre entonces se dice que el mes tiene 30 días.
  3. Si el mes no se encuentra en los subconjuntos analizados en los pasos 1 y 2 entonces el mes tiene 31 días.
El algoritmo para hallar el número de días que tiene un determinado mes puede sintetizarse de la siguiente manera:

 obtenerDiasMes(año: int, mes: int): int
   asumamos que diasMes = 31
    Analizamos el valor de (mes)
      case: <2> entonces:
                       si año es bisiesto diasMes ! 29 de otra manera diasMes ! 28
       case: <4, 6, 9, 11> entonces:
                       diasMes ! 30
       retorne el valor que tiene diasMes
Fin del algoritmo

 El código java que implementa el algoritmo anterior que halla el numero de meses que tiene un determinado mes de un año dado será podría como el que se presenta a continuación:
public static int getDiasMes(int año,int mes){
        int diasMes=31;
        switch(mes){
            case 2:
                if(esBisiesto(año))diasMes=29;
                else diasMes=28;
                break;
            case 4:case 6:case 9:case 11:
                diasMes=30;
        }
        return diasMes;
    }

 CÁLCULO DEL DÍA DE LA SEMANA DE UNA FECHA DETERMINADA

Son muchas las razones para querer saber el día de la semana que cayó o caerá una determinada fecha del calendario gregoriano. Ejemplos: el deseo de una persona saber en qué día de la semana nació, el fabricante de almanaques quiere saber los días de las semanas en que el primero de cada mes, y muchas más razones que no son importantes de discutir por ahora.
Para el caso de la implementación del software para un calendario interactivo es necesario saber la manera de encontrar el día de la semana en que cae el primero de cada para un año cualquiera válido en el calendario gregoriano. Si encontramos un algoritmo que nos permita hallar el día de la semana de cualquier fecha nos será fácil hacer el software que permita visualizar e interactuar con calendarios como el que se muestra en la siguiente figura.

Figura 2. Ejemplo de un calendario interactivo

El calendario de la figura anterior corresponde a la fecha del 11 de agosto de 2013 y el usuario puede interactuar con este calendario seleccionando cualquier día del mes buscar un determinado mes pulsando las flechas de atrasar o avanzar meses o digitar un año determinado para el calendario en dicho año.
Existen muchos tipos de algoritmos para hallar el día se la semana para una determinada fecha dado el año, el mes y el día del mes. Pero para nuestro coso tomamos el algoritmo ideado por el señor Julius Christian Johannes Zeller. Sin entrar a profundizar la manera como el señor Zeller encontró el algoritmo su definición es como se muestra a continuación:

 calcularDiaSemana(año: int, mes: int, dia: int): int
   d: int <domingo = 0, lunes = 1,martes = 2, miércoles = 3, jueves = 4, viernes = 5, sábado = 6>
   año: int <año1583>
   mes: int <enero =1, febrero=2, marzo=3, abril=4, mayo=5, junio=6, julio=7, agosto=8, septiembre=9,
   octubre=10, noviembre=11, diciembre=12>
   a, y, m: int
   1. a = (14 – mes)/12
   2. y = año – a
   3. m = mes – (12*a) – 2
   4. d = (dia + y + (y/4) – (y/100) + (y/400) + (31*m)/12) mod 7
   5. tomar el valor de d como el día de la semana en el que cae la fecha dada año/mes/dia
 Fin del algoritmo 

La implementación del algoritmo como un método de java es como el que se muestra a continuación:

public static int calcularDiaSemana(int año,int mes,int dia){
        int a,y,m,d;
        a=(14-mes)/12;
        y=año-a;
        m=mes+(12*a)-2;
        d=(dia+y+(y/4)-(y/100)+(y/400)+(31*m)/12)%7;       
        return d;
    }

Ejercicio resuelto. Hacer los cálculos para averiguar qué día de la semana cayó el 20 de julio de 1810. Fecha del grito de la independencia de Colombia. La historia dice que era un viernes día de mercado cuando…

Cálculos: año = 1810; mes = 7; día = 20; a = (14 – 7)/12 = 0 [división de enteros], entonces a = 0; y = 1810 – 0 = 1810, entonces y = 1810; m = 7 +(12*0) – 2 = 5; entonces m =5; d = (20+1810+(1810/4)-(1810/100)+(1810/400)+(31*5)/12) mod 7= (20+1810+452-18+4+12) mod 7 = 5, entonces d = 5 y el corresponde al viernes que coincide con lo de dice la historia.
Ejercicio para resolver. Llenar los cuadros de la matriz de la figura que se muestra a continuación para que corresponda al  calendario del mes de febrero del año 3500.
Figura 3. Matriz para llenar calendario
 
 
CÓDIGO JAVA PARA HALLAR LA FECHA ACTUAL
La plataforma de desarrollo de programas en java proporciona varias clases y métodos para obtener la fecha actual, la fecha del sistema computador. Una de estas clases es la clase Calendar y que se encuentra en el paquete java.util.  Para que usted inicie el estudio de la clase Calendar a continuación se presenta un pequeño programa java que obtiene y muestra en la consola la fecha actual del sistema.

import java.util.*;
public class CalculoFechaActual {
    public static void main(String[] args) {
        Calendar fecha=Calendar.getInstance();
        int añoActual=fecha.get(Calendar.YEAR);
        int mesActual=fecha.get(Calendar.MONTH)+1;
        int diaActual=fecha.get(Calendar.DAY_OF_MONTH);
        System.out.print("La fecha actual del sistema es: ");
        System.out.println(añoActual+"/"+mesActual+"/"+diaActual);
    }
}

Analice el código anterior y saque sus propias conclusiones y aplíquelas en el desarrollo de sus aplicaciones. Es importante que estudie los diferentes métodos que proporciona esta clase, la clase Calendar.

Caso de estudio: Diseño y programación de un calendario

Desarrollar en java un calendario que le permita al usuario seleccionar cualquier fecha desde el año 1583 (año en que el comenzó a regir el calendario gregoriano) hasta el año en que propongan un nuevo sistema de calendario. La vista del calendario interactivo para esta aplicación debe ser como el que se muestra en la siguiente figura.

Figura 4. Vista calendario para la aplicación
 

La vista del calendario de la figura anterior muestra la fecha: 13 de agosto de 2013 (1/8/2013). El usuario puede seleccionar cualquier año digitando en el campo de texto de la barra inferior y para confirmar el año se pulsa la tecla ENTER del teclado del computador. Al pulsar ENTER se visualizará el calendario del mes de enero del año editado. Para seleccionar el mes el usuario pulsará las flechas de avanzar o atrasar  y luego seleccionar el correspondiente día del mes. Al pulsar el botón de cerrar el calendario se ocultará y la fecha seleccionada quedará  disponible para la aplicación. Siempre que introduce un nuevo año desde el campo de texto de la barra inferior se visualizara el mes de enero y el día primero seleccionado. El paso de un mes a otro el calendario del nuevo mes muestra el día primero seleccionado, independiente del día que estaba seleccionado del anterior mes. Algunas consideraciones o especificaciones: a) si el mes visualizado en el calendario es enero de una año cualquier  y se pulsa el botón de la flecha de retroceder el calendario debe mostrar el mes de diciembre del año anterior y b) si el mes visualizado en el calendario es el mes de diciembre de un año cualquiera y se pulsa el botón de la flecha de adelantar entonces el calendario mostrará el mes de enero del año siguiente. Para el uso de este calendario se debe implementar una aplicación cuya ventana de uso es como la que se muestra en la siguiente figura.
Figura 5. Vista ventana usuaria calendario

 



La interacción del usuario con la aplicación es muy simple, al pulsar el botón “Seleccionar Fecha” se visualizará el calendario como el que se muestra en la figura 4 y una vez seleccionada la fecha y cerrado el calendario esta fecha seleccionada se visualizará en la ventana de la aplicación.

Especificación de requerimientos

Figura 6. Diagrama de casos de uso
 

Diseño estructural


Figura 7. Diseño arquitectónico estático


La vista del diagrama de la figura anterior nos muestra que este sistema consta de cuatro clases definidas en el paquete aplicación.  Según el diseño arquitectónico estático la clase Aplicación tiene dependencia de la clase VentanaPrincipal, y esta última tiene dependencia de las clases Fecha y Calendario y esta última tiene a su vez dependencia de la clase Fecha. Las clases VentanaPrincipal y Calendario tienen relaciones de herencia con las clases JFrame y JDialog respectivamente. Las clases JFrame y JDialog son proporcionadas por el paquete javax.swing proporcionado por las plataformas de desarrollo java.

Recomendación 1. Siempre que usted necesite desarrollar una aplicación software con lenguajes orientados a objetos, dedique un tiempo a dibujar el diseño arquitectónico estático antes de tomar un computador para empezar a escribir el código. Le quiero decir, que si usted tiene previamente el diseño arquitectónico le será muy fácil el montaje de las clases que componen el proyecto.

 Diseño Modelo Dinámico


Figura 8. Diseño arquitectónico dinámico


 Tutorial: Montaje de un proyecto java


Este tutorial le suministra el conocimiento requerido para montar un proyecto siguiendo un diseño arquitectónico como el que se muestra en la figura anterior.

  1. Abrir el entorno de desarrollo (para nuestro caso será NetBeans 7.3). Con esto nuestro computador queda listo para iniciar el trabajo de desarrollo del proyecto.
  2. Crear un nuevo proyecto desde el menú Archivo o dar el comando abreviado <Ctrl> <Mayus><N> para visualizar el cuadro de diálogo para seleccionar la categoría y el tipo de proyecto. Se selecciona la categoría Java y el tipo de proyecto Java Aplicación y posteriormente pulse el botón siguiente (Next) para proceder a editar el nombre del proyecto.
  3. En el cuadro de diálogo de Nuevo proyecto se edita el nombre del proyecto y para nuestro caso y según el diseño arquitectónico el nombre es aplicación(nombre del paquete que contendrá nuestras clases). La plataforma en forma automática pone el nombre la clase Aplicación. Observe que es el mismo nombre del paquete pero la primera letra en mayúscula. La clase Aplicación será la clase ejecutable y será la que contiene el método estático main().
  4. Las cuatro clases serán ubicadas en diferentes archivos. Observe que las cuatro clases están en el mismo paquete llamado aplicación. Se implementan las dos relaciones de herencia de las clases VentanaPrincipal y Calendario.
  5. Programación de clases y pruebas.
  6. Fin del tutorial

 Programación de las clases


Programación de la clase Fecha


package aplicacion;
import java.util.*;
public class Fecha {   
    public static Calendar calendario=Calendar.getInstance();
    // *********
    private static int añoSel,mesSel,diaSel,diaSemanaSel;
    public static boolean fechaDisponible=false;
    // *********
    public static String strMeses[]={"Enero","Febrero","Marzo","Abril","Mayo",
    "Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};
    public static String strDiasSemana[]={"Domingo","Lunes","Martes","Miercoles",
        "Jueves","Viernes","Sábado"};
    public static String toStringFecha(){
        return calendario.get(Calendar.DAY_OF_MONTH)+"/"+(calendario.get(Calendar.MONTH)+1)+"/"+
                calendario.get(Calendar.YEAR);
    }
    public void incrementarMes(){
        calendario.set(Calendar.MONTH,calendario.get(Calendar.MONTH)+1);
        calendario.set(Calendar.DAY_OF_MONTH,1);
    }
    public void decrementarMes(){
        calendario.set(Calendar.MONTH,calendario.get(Calendar.MONTH)-1);
        calendario.set(Calendar.DAY_OF_MONTH,1);
    }
    public void establecerDia(int dia){
        calendario.set(Calendar.DAY_OF_MONTH,dia);
    }
    public void establecerMes(int mes){
        calendario.set(Calendar.MONTH,mes-1);
        calendario.set(Calendar.DAY_OF_MONTH,1);
    }
    public void establecerAño(int año){
        calendario.set(Calendar.YEAR,año);
        calendario.set(Calendar.DAY_OF_MONTH,1);
    }
    public int obtenerDiaSemana(){
        return calendario.get(Calendar.DAY_OF_WEEK)-1;
    }
    public int obtenerDia(){
        return calendario.get(Calendar.DAY_OF_MONTH);
    }
    public int obtenerMes(){
        return calendario.get(Calendar.MONTH)+1;
    }
    public int obtenerAño(){
        return calendario.get(Calendar.YEAR);
    }
    public String toStrintMesAño(){
        String mensaje=strMeses[obtenerMes()-1]+" "+Integer.toString(obtenerAño());
        return mensaje;
    }
    public int calcularDiaSemanaPrimero(){
        int año=calendario.get(Calendar.YEAR);
        int mes=calendario.get(Calendar.MONTH)+1;
        int dia=1;
        int a,y,m,d;
        a=(14-mes)/12;
        y=año-a;
        m=mes+(12*a)-2;
        d=(dia+y+(y/4)-(y/100)+(y/400)+(31*m)/12)%7;       
        return d;
    }
   
    public boolean esBisiesto(){
        int año=calendario.get(Calendar.YEAR);
        return (año%4==0)||((año%100!=0)&&(año%400==0));
    }
    public int getDiasMes(){
        int año=calendario.get(Calendar.YEAR);
        int mes=calendario.get(Calendar.MONTH)+1;
        int diasMes=31;
        switch(mes){
            case 2:
                if(esBisiesto())diasMes=29;
                else diasMes=28;
                break;
            case 4:case 6:case 9:case 11:
                diasMes=30;
        }
        return diasMes;
    }
    // ************
    public static int _getAño(){
       return añoSel;
    }
    public static int _getMes(){
       return mesSel;
    }
    public static int _getDia(){
       return diaSel;
    }
    public static int _getDiaSemana(){
        return diaSemanaSel;
    }
    public static void _setAño(int año){
        añoSel=año;
    }
    public static void _setMes(int mes){
        mesSel=mes;
    }
    public static void _setDia(int dia){
        diaSel=dia;
    }
    public static void _setDiaSemanaSel(int dia){
        diaSemanaSel=dia;
    }  
}

 


Programación de la clase Calendario

package aplicacion;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class Calendario extends JDialog implements ActionListener,KeyListener{
    final int ANCHO=252,ALTO=180;
    final Cursor mano=new Cursor(Cursor.HAND_CURSOR);   
    JPanel paneles[]=new JPanel[4];
    JButton btnCerrar,btnAdelantar,btnAtrasar;  
    JLabel etiqDiasSemana[]=new JLabel[7];
    JButton btnDiasMes[]=new JButton[42];
    JLabel etiqAño,etiqMesAño;
    JTextField txtAño;
    Font fuente;
    String flechaAtras=String.valueOf('\u25C4');
    String flechaAdelante=String.valueOf('\u25BA');
    String strDiasSemana[]={"Dom","Lun","Mar","Mie","Jue","Vie","Sab"};
    Color fondoTitulo,fondoDiaSeleccionado,fondoDiasMes,fondoSemana;
    Fecha fecha;
    public static int AÑO,MES,DIA;
    Calendario(){
        fecha=new Fecha();
        setSize(ANCHO,ALTO);       
        setLayout(null);
        setModal(true);
        fondoTitulo=new Color(20,255,20);
        fondoDiaSeleccionado=new Color(100,255,100);
        fondoSemana=new Color(200,255,200);
        fondoDiasMes=new Color(255,255,255);
        this.setLocationRelativeTo(null);
        setUndecorated(true);
        fuente=new Font("serif",Font.PLAIN+Font.BOLD,12);
        inicializarComponentes();       
        establecerCalendario();
    }
    private void inicializarComponentes(){
        int a=ALTO/9, b=ANCHO/7;
        fecha=new Fecha();
        for(int i=0;i<paneles.length;i++){
            paneles[i]=new JPanel();           
            add(paneles[i]);
            switch(i){
                case 0:
                    paneles[i].setLayout(null);
                    paneles[i].setBounds(0,0,ANCHO,a);
                    paneles[i].setBackground(fondoTitulo);
                    btnCerrar=new JButton("X");
                    btnCerrar.setCursor(mano);
                    btnCerrar.setFont(fuente);
                    btnCerrar.setBounds(ANCHO-a-4,1,a,a-2);
                    btnCerrar.setBorder(BorderFactory.createEtchedBorder());
                    btnCerrar.setBackground(new Color(255,0,0));
                    btnCerrar.setForeground(new Color(255,255,255));
                    paneles[i].add(btnCerrar);
                    btnCerrar.addActionListener(this);
                    btnAtrasar=new JButton(flechaAtras);
                    btnAtrasar.setCursor(mano);
                    btnAtrasar.setBounds(a-8,1,a,18);
                    btnAtrasar.setBackground(fondoTitulo);
                    btnAtrasar.setBorder(BorderFactory.createEmptyBorder());
                    btnAtrasar.setHorizontalAlignment(JButton.CENTER);
                    btnAtrasar.setForeground(new Color(0,0,255));
                    paneles[i].add(btnAtrasar);
                    btnAtrasar.addActionListener(this);
                    btnAdelantar=new JButton(flechaAdelante);
                    btnAdelantar.setCursor(mano);
                    btnAdelantar.setBounds(ANCHO-2*a-8,1,a,18);
                    btnAdelantar.setBackground(fondoTitulo);
                    btnAdelantar.setBorder(BorderFactory.createEmptyBorder());
                    btnAdelantar.setHorizontalAlignment(JButton.CENTER);
                    btnAdelantar.setForeground(new Color(0,0,255));
                    paneles[i].add(btnAdelantar);
                    btnAdelantar.addActionListener(this);
                    add(paneles[i]);
                    etiqMesAño=new JLabel();
                    etiqMesAño.setFont(fuente);
                    etiqMesAño.setBounds(2*a+8,1,7*a,18);                   
                    etiqMesAño.setHorizontalAlignment(JLabel.CENTER);
                    paneles[i].add(etiqMesAño);
                    break;
                case 1:
                    paneles[i].setLayout(new GridLayout(0,7));
                    paneles[i].setBounds(0,a,ANCHO,a);
                    paneles[i].setBackground(fondoSemana);
                    for(int j=0;j<etiqDiasSemana.length;j++){
                        etiqDiasSemana[j]=new JLabel(strDiasSemana[j]);                       
                        etiqDiasSemana[j].setBounds(0,a,a,18);                        
                        etiqDiasSemana[j].setFont(fuente);
                        etiqDiasSemana[j].setHorizontalAlignment(JLabel.CENTER);
                        etiqDiasSemana[j].setBorder(BorderFactory.createEtchedBorder());
                        if(j==0)etiqDiasSemana[j].setForeground(new Color(255,0,0));
                        else etiqDiasSemana[j].setForeground(new Color(0,0,255));
                        paneles[i].add(etiqDiasSemana[j]);                       
                    }                   
                    add(paneles[i]);
                    break;
                case 2:
                    paneles[i].setLayout(new GridLayout(6,7));
                    paneles[i].setBounds(0,2*a,ANCHO,ALTO-3*a);
                    for(int j=0;j<btnDiasMes.length;j++){
                        btnDiasMes[j]=new JButton();
                        btnDiasMes[j].setCursor(mano);
                        btnDiasMes[j].setBackground(fondoDiasMes);
                        btnDiasMes[j].setBorder(BorderFactory.createEtchedBorder());                       
                        paneles[i].add(btnDiasMes[j]);
                        btnDiasMes[j].addActionListener(this);
                    }                   
                    break;
                case 3:
                    paneles[i].setLayout(null);
                    paneles[i].setBounds(0,8*a,ANCHO,a);
                    paneles[i].setBackground(new Color(0,255,0));
                    etiqAño=new JLabel("Digite año: ");
                    etiqAño.setBounds(2,2,80,18);
                    etiqAño.setFont(fuente);
                    etiqAño.setBackground(new Color(0,255,0));
                    etiqAño.setHorizontalAlignment(JLabel.RIGHT);
                    paneles[i].add(etiqAño);
                    add(paneles[i]);
                    txtAño=new JTextField();
                    txtAño.setBounds(90,1,60,18);
                    txtAño.setBackground(fondoDiasMes);
                    txtAño.setBorder(BorderFactory.createBevelBorder(1));
                    txtAño.setHorizontalAlignment(JTextField.RIGHT);
                    paneles[i].add(txtAño);
                    txtAño.addKeyListener(this);
                    break;
            }
        }
    }   
    private void limpiarDiasMes(){
        for(int i=0;i<btnDiasMes.length;i++){
            btnDiasMes[i].setText(null);
            btnDiasMes[i].setEnabled(false);
            btnDiasMes[i].setBackground(fondoDiasMes);
        }
    }
    private void establecerCalendario(){       
        limpiarDiasMes();
        etiqMesAño.setText(fecha.toStrintMesAño());
        int d=fecha.calcularDiaSemanaPrimero();
        int diasMes=fecha.getDiasMes();
        for(int i=0;i<diasMes;i++){
            btnDiasMes[d+i].setText(Integer.toString(i+1));
            btnDiasMes[d+i].setEnabled(true);
            if((d+i)%7==0)btnDiasMes[d+i].setForeground(new Color(255,0,0));
            else btnDiasMes[d+i].setForeground(new Color(0,0,255));
            if((i+1)==fecha.obtenerDia())btnDiasMes[d+i].setBackground(fondoDiaSeleccionado);
        }
    }
       
    // MODELO DINÁMICO
   
    public void actionPerformed(ActionEvent ev){
       if(ev.getSource()==btnCerrar){
            dispose();
            Fecha._setAño(fecha.obtenerAño());
            Fecha._setMes(fecha.obtenerMes());
            Fecha._setDia(fecha.obtenerDia());
            Fecha._setDiaSemanaSel(fecha.obtenerDiaSemana());
            Fecha.fechaDisponible=true;           
            if(Fecha.fechaDisponible)
             txtAño.setText(Integer.toString(Fecha._getAño()));
        }else if(ev.getSource()==btnAtrasar){
            fecha.decrementarMes();
            establecerCalendario();
        }else if(ev.getSource()==btnAdelantar){
            fecha.incrementarMes();
            establecerCalendario();
        }else{
            int d=fecha.calcularDiaSemanaPrimero();
            int kdias=fecha.getDiasMes();           
            for(int i=0;i<kdias;i++){
               if(btnDiasMes[d+i].getBackground()==fondoDiaSeleccionado)
                   btnDiasMes[d+i].setBackground(new Color(255,255,255));
               if(ev.getSource()==btnDiasMes[d+i]){
                  fecha.establecerDia(i+1);
                  btnDiasMes[d+i].setBackground(fondoDiaSeleccionado);
               }
            }           
       }
              
    }   
    public void keyPressed(KeyEvent ev){      
       if((ev.getKeyChar()=='\n')&&(!txtAño.getText().isEmpty())){                          
          try{
             int año=Integer.parseInt(txtAño.getText());
             if(año<1583)throw new Exception("...");
             fecha.establecerAño(año);
             fecha.establecerMes(1);
             this.etiqMesAño.setText(fecha.toStrintMesAño());            
             txtAño.setText("");
             establecerCalendario();
          }catch (Exception e){
             txtAño.setText(null);
          }    
       }
   }
   public void keyReleased(KeyEvent ev){
       int año;
       try{
              año=Integer.parseInt(txtAño.getText());             
           }catch (Exception e){
               txtAño.setText("");
           }
   }
   public void keyTyped(KeyEvent ev){
       // Sin uso
   }
}
 

Programación de la clase VentanaPrincipal

package aplicacion;
import javax.swing.*;
import java.awt.event.*;
public class VentanaPrincipal extends JFrame implements ActionListener{
    final int ANCHO=450,ALTO=200;
    JPanel panel;
    JLabel labAño,labMes,labDia,labDiaSemana;
    JTextField txtAño,txtMes,txtDia,txtDiaSem;
    JButton btnVerCalendario,btnLimpiar;
    public VentanaPrincipal(){
        Fecha.fechaDisponible=false;
        setSize(ANCHO,ALTO);
        setResizable(false);
        setLocationRelativeTo(null);
        this.setTitle("Aplicación por: Jorge Herrera Castillo");
        this.setLayout(null);
        iniciarComponentes();
        setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
    }
    private void iniciarComponentes(){
        panel=new JPanel();
        panel.setBounds(10,10,ANCHO-30,110);
        panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createBevelBorder(1),"Fecha Seleccionada"));
        panel.setLayout(null);
        labAño=new JLabel("Año:");
        labAño.setBounds(20,35,30,20);
        labAño.setHorizontalAlignment(JLabel.RIGHT);
        panel.add(labAño);
        txtAño=new JTextField();
        txtAño.setBounds(60,35,50,20);
        txtAño.setHorizontalAlignment(JTextField.CENTER);
        txtAño.setEditable(false);
        txtAño.setBorder(BorderFactory.createBevelBorder(1));
        panel.add(txtAño);
        labMes=new JLabel("Mes:");
        labMes.setBounds(120,35,30,20);
        labMes.setHorizontalAlignment(JLabel.RIGHT);
        panel.add(labMes);
        txtMes=new JTextField();
        txtMes.setBounds(160,35,100,20);
        txtMes.setHorizontalAlignment(JTextField.CENTER);
        txtMes.setEditable(false);
        txtMes.setBorder(BorderFactory.createBevelBorder(1));
        panel.add(txtMes);       
        labDia=new JLabel("Dia mes:");
        labDia.setBounds(270,35,60,20);
        labDia.setHorizontalAlignment(JLabel.RIGHT);
        panel.add(labDia);
        txtDia=new JTextField();
        txtDia.setBounds(340,35,40,20);
        txtDia.setHorizontalAlignment(JTextField.CENTER);
        txtDia.setEditable(false);
        txtDia.setBorder(BorderFactory.createBevelBorder(1));
        panel.add(txtDia);       
        labDiaSemana=new JLabel("Dia Semana:");
        labDiaSemana.setBounds(70,75,80,20);
        labDiaSemana.setHorizontalAlignment(JLabel.RIGHT);
        panel.add(labDiaSemana);
        txtDiaSem=new JTextField();
        txtDiaSem.setBounds(160,75,100,20);
        txtDiaSem.setHorizontalAlignment(JTextField.CENTER);
        txtDiaSem.setEditable(false);
        txtDiaSem.setBorder(BorderFactory.createBevelBorder(1));
        panel.add(txtDiaSem);       
        add(panel);
        btnVerCalendario=new JButton("Seleccionar Fecha");
        btnVerCalendario.setBounds(ANCHO/3-90,ALTO-70,160,30);
        btnVerCalendario.setBorder(BorderFactory.createBevelBorder(0));
        add(btnVerCalendario);
        btnVerCalendario.addActionListener(this);       
        btnLimpiar=new JButton("Limpiar Fecha");
        btnLimpiar.setBounds(ANCHO/3-90+170,ALTO-70,160,30);
        btnLimpiar.setBorder(BorderFactory.createBevelBorder(0));       
        add(btnLimpiar);
        btnLimpiar.addActionListener(this);
    }
   
    // Modelo dinámico
    public void actionPerformed(ActionEvent ev){       
       if(ev.getSource()==btnVerCalendario){         
         Calendario calendario=new Calendario();
         calendario.setVisible(true);       
        }else if(ev.getSource()==btnLimpiar){         
          txtAño.setText("");
          txtMes.setText("");
          txtDia.setText("");
          txtDiaSem.setText("");
          Fecha.fechaDisponible=false;         
        }
       if(Fecha.fechaDisponible){
          txtAño.setText(Integer.toString(Fecha._getAño()));
          txtMes.setText(Fecha.strMeses[Fecha._getMes()-1]);
          txtDia.setText(Integer.toString(Fecha._getDia()));
          txtDiaSem.setText(Fecha.strDiasSemana[Fecha._getDiaSemana()]);      
       }
       }      
}
 Programación de la clase Aplicación
package aplicacion;
public class Aplicacion {
    public static void main(String[] args) {
        new VentanaPrincipal();
    }
}
 



 

 

No hay comentarios:

Publicar un comentario