jueves, 9 de septiembre de 2010

C-JAVA: Clase CeldaCalendario

Esta clase me la fabrique para poder hacerme un calendario donde apuntar diferentes cosas. Es un JPanel dibujado que implementa el MouseListener para que, al pulsar sobre cada celda, realice una accion (en mi caso mostrar un dialogo).
Se le pasa como parametro el año y, segun el mismo, genera un calendario de 12 filas (una por mes) y diversas columnas identificando el dia de cada mes en que dia de la semana cae.
Os paso el codigo por si os resulta interesante y os quereis ahorrar el tecleo. No dudeis en preguntar alguna duda.

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

public class CeldaCalendario extends JPanel implements MouseListener
    {
    static final long serialVersionUID=1;
    String[][] texto=new String[37][12];//texto a poner en la celda
    Color[][] color=new Color[37][12];//color de fondo de la celda
    int[] columna=new int[12];
    public int anno=0;
    Importar importar;//Esta es una clase propia que es otro JPanel con datos que importo, asi que podeis ahorrar o modificar sus alusiones.

    public CeldaCalendario(Importar importar)
      {
      this.importar=importar;
      this.addMouseListener(this);
      for (int a=0;a<37;a++)
        {
        for (int b=0;b<12;b++)
          {
          texto[a][b]="";
          color[a][b]=new Color(255,255,200);
          }
        }
      }

    public void paint(Graphics g)
      {
      //pintado de fondo
      g.setColor(new Color(255,255,200));
      g.fillRect(0,21,667,261);
      g.setColor(Color.yellow);
      g.fillRect(0,0,667,20);
      g.setFont(new Font("Monospaced",0,12));
      g.setColor(Color.black);
      //dibujo de grid
      for (int a=0;a<38;a++)
        {
        g.drawLine(a*18,0,a*18,260);
        }
      for (int a=0;a<14;a++)
        {
        g.drawLine(0,a*20,666,a*20);
        }
      //dibujo de iniciales dias
      String d="LMXJVSD";
      for (int a=0;a<37;a++)
        {
        g.drawString(d.substring(a%7,(a%7)+1),a*18+6,14);
        }
      for (int a=0;a<37;a++)
        {
        for (int b=0;b<12;b++)
          {
          g.setColor(color[a][b]);
          g.fillRect(a*18+1,b*20+21,17,19);
          g.setColor(Color.black);
          g.drawString(texto[a][b],a*18+2,b*20+35);
          }
        }
      }

    public void repintar()
      {
      RepaintManager.currentManager(this).isCompletelyDirty(this);
      RepaintManager.currentManager(this).paintDirtyRegions();
      }

    public void mouseClicked(MouseEvent e)
      {
      double x,y;
      x=e.getPoint().getX();
      y=e.getPoint().getY();
      marcarPunto((int)x,(int)y);
      }

    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}

    public void marcarPunto(int x, int y)
      {
      x=(int)(x/18);
      y=(int)(y/20);
      String textoauxiliar=texto[x][y-1];
      if (textoauxiliar.equalsIgnoreCase(""))
        return;
      int mes=y;
      String fecha=textoauxiliar.replace(' ','0')+"-";
      if (mes<10)
        fecha+="0";
      fecha+=mes+"-";
      textoauxiliar=(""+anno).substring(2);
      fecha+=textoauxiliar;
      importar.mostrarFecha(fecha);//este es el metodo que hace llamada al dialogo con los datos correspondientes a la celda
      repaint();
      }
    }


Para generar e inicializar el JPanel dependiendo del año uso este metodo:

  public void generarAnno()
    {
    int anno=comboAnno.getSelectedIndex()+2006;//vale con poner un año de 4 digitos
    cc.anno=anno;//cc es el nombre del CeldaCalendario
    int dias=365;
    if (anno%4==0) dias++;
    GregorianCalendar calendario=new GregorianCalendar(anno-1,11,31);
    for (int a=0;a<37;a++)
      {
      for (int b=0;b<12;b++)
        {
        cc.texto[a][b]="";
        cc.color[a][b]=new Color(255,255,0);
        }
      }
    int columna=0;
    //pintarTabla
    for (int d=0;d
      {
      calendario.add(GregorianCalendar.DATE,1);
      if (calendario.get(GregorianCalendar.DATE)==1)
        {
        columna=(calendario.get(GregorianCalendar.DAY_OF_WEEK)+5)%7;
        cc.columna[calendario.get(GregorianCalendar.MONTH)]=columna;
        }
      if (calendario.get(GregorianCalendar.DAY_OF_WEEK)==1 || calendario.get(GregorianCalendar.DAY_OF_WEEK)==7)
        {
        cc.color[columna+calendario.get(GregorianCalendar.DATE)-1][calendario.get(GregorianCalendar.MONTH)]=Color.red;
        }
      else
        {
        cc.color[columna+calendario.get(GregorianCalendar.DATE)-1][calendario.get(GregorianCalendar.MONTH)]=Color.white;
        }
      if (calendario.get(GregorianCalendar.DATE)<10)
        cc.texto[columna+calendario.get(GregorianCalendar.DATE)-1][calendario.get(GregorianCalendar.MONTH)]=" "+calendario.get(GregorianCalendar.DATE);
      else
        cc.texto[columna+calendario.get(GregorianCalendar.DATE)-1][calendario.get(GregorianCalendar.MONTH)]=""+calendario.get(GregorianCalendar.DATE);
      }
    //aqui se asignan los colores segun los datos obtenidos
    for (int d=0;d
      {
      DatosVacas da=(DatosVacas)vDatos6.elementAt(d);
      if (da.fecha.get(GregorianCalendar.YEAR)==anno)
        {
        if (da.fechaH.get(GregorianCalendar.YEAR)==2001)
          cc.color[cc.columna[da.fecha.get(GregorianCalendar.MONTH)]+da.fecha.get(GregorianCalendar.DATE)-1][da.fecha.get(GregorianCalendar.MONTH)]=Color.green;
        else
          {
          GregorianCalendar fechaPoner=(GregorianCalendar)da.fecha.clone();
          while (-1
            {
            if (fechaPoner.get(GregorianCalendar.DAY_OF_WEEK)!=1 && fechaPoner.get(GregorianCalendar.DAY_OF_WEEK)!=7)
              {//para que no ponga vacaciones en sabado o domingo
              cc.color[cc.columna[fechaPoner.get(GregorianCalendar.MONTH)]+fechaPoner.get(GregorianCalendar.DATE)-1][fechaPoner.get(GregorianCalendar.MONTH)]=Color.green;
              }
            fechaPoner.add(GregorianCalendar.DATE,1);
            }
          }
        }
      }
    cc.repintar();
    cc.repaint();
    }

3 comentarios:

  1. ¡Cambio de look en el blog! No sé pero no me acaba de gustar...

    ResponderEliminar
  2. ¿Y asi te gusta mas? Tonos azules y mis zapatillas de fondo.

    ResponderEliminar
  3. Este mucho mejor, sin duda. Gracias por tener en cuenta mi opinión. Eres un buen tío (pero no te lo creas, ¿eh?).

    ResponderEliminar