Estoy realizando un calendario para una aplicación. Tengo un JTable donde muestro lo que seria el calendario anual como si fuera una hoja de cálculo. Luego el usuario en un JDateChooser va eligiendo los días que desea y se van marcando en él.
Código PHP:
public class cCalendari {
cTaulaRenderResaltarDies trcp = new cTaulaRenderResaltarDies ();
private DefaultTableModel mtblCalendar; //Table model
String[] months = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
static final int mes = 24;
public int obtenir_numero_mes (int x){
int m;
if(x==0){
m = GregorianCalendar.JANUARY;
}else if(x==2){
m = GregorianCalendar.FEBRUARY;
}else if(x==4){
m = GregorianCalendar.MARCH;
}else if(x==6){
m = GregorianCalendar.APRIL;
}else if(x==8){
m = GregorianCalendar.MAY;
}else if(x==10){
m = GregorianCalendar.JUNE;
}else if(x==12){
m = GregorianCalendar.JULY;
}else if(x==14){
m = GregorianCalendar.AUGUST;
}else if(x==16){
m = GregorianCalendar.SEPTEMBER;
}else if(x==18){
m = GregorianCalendar.OCTOBER;
}else if(x==20){
m = GregorianCalendar.NOVEMBER;
}else if(x==22){
m = GregorianCalendar.DECEMBER;
}else{
m = -1;
}
return m;
}
public void netejar_calendari_JTable (JTable taula){
mtblCalendar = (DefaultTableModel) taula.getModel();
for (int x = 0; x<mes; x ++){
mtblCalendar.setValueAt(months[x/2], x, 0);
for (int j=0; j<taula.getColumnCount(); j++){
mtblCalendar.setValueAt(null, x, j);
}
}
}
public void printar_calendari_JTable (JTable taula, int any){
mtblCalendar = (DefaultTableModel) taula.getModel();
int cont = 0, ds; //Number Of Days, Start Of Month, Last day
int diaSetmana = 0;
//Get first day of month and number of days
GregorianCalendar cal = new GregorianCalendar(any,cont,0);
//Draw calendar
for(int x = 0; x<mes; x ++){
cont = obtenir_numero_mes (x);
if(cont!=-1){//Printem el mes cada dues fileres
taula.setFont(new java.awt.Font("Tahoma", 1, 10));
taula.setGridColor(Color.BLACK);
mtblCalendar.setValueAt(months[x/2], x, 0);
cal.set(any, cont, GregorianCalendar.DAY_OF_MONTH);
//taula.setFont(new java.awt.Font("Tahoma", 0, 10));
ds = cal.get(GregorianCalendar.DAY_OF_WEEK);
//ls = cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
for(int z=1;z<=cal.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);z++){ // A cada mes printar els dies que té el mes
if(z==1){
diaSetmana = z + (ds+1);
}
if(diaSetmana>7){
mtblCalendar.setValueAt(z, x, (z + (ds+1))-7);
}else{
mtblCalendar.setValueAt(z, x, z + (ds+1));
}
}
}
}
//Marcar los fines de semana
taula.setDefaultRenderer(Object.class,new cTaulaRenderResaltarDies ());
}
public void printar_dia_seleccionado (JTable taula,int any, int mes, int dia){
int fila, columna, dia1;
GregorianCalendar cal = new GregorianCalendar(any,mes,0);
//Cogemos en que dia cae el preimer dia del mes
dia1 = cal.get(GregorianCalendar.DAY_OF_WEEK);
//Segons el mes adaptem el valor per a que marqui la fila corresponent
if(mes==0){
fila = (mes)+ 1;
}else{
fila = (mes*2) +1;
}
//El valor de la columna dependrà del valor del primer dia del mes
columna = (dia + dia1)-1;
mtblCalendar.setValueAt("T", fila, columna);
//Marcar los fines de semana
//taula.setDefaultRenderer(Object.class,new cTaulaRenderResaltarDies (fila, columna));
}
}
He sobreescrito el metodo DefaultCellRenderer para ir marcando los dias que son fin de semana, las linias de cada mes donde se muestra el dia del mes y modificao el color de fondo y el valor de la celda de los dias seleccionados.
Código PHP:
@Override
public Component getTableCellRendererComponent (JTable table, Object value, boolean selected, boolean focused, int row, int column){
super.getTableCellRendererComponent(table, value, selected, focused, row, column);
if (row==0 || row==2 || row== 4 || row==6 || row== 8 || row== 10 || row== 12 || row== 14 || row== 16 || row== 18 || row== 20 || row== 22){
setBackground(linia);
}else if (!((column == 6 || column == 7) ||
(column == 13 || column == 14) ||
(column == 20 || column == 21) ||
(column == 27 || column == 28) ||
(column == 34 || column == 35) ||
(column == 41 || column == 42)) && (table.getValueAt(row, column) == null)){
setBackground(blanc);
}else if (!((column == 6 || column == 7) ||
(column == 13 || column == 14) ||
(column == 20 || column == 21) ||
(column == 27 || column == 28) ||
(column == 34 || column == 35) ||
(column == 41 || column == 42)) && (table.getValueAt(row, column) != null)){
setBackground(verd);
}else if (((column == 6 || column == 7) ||
(column == 13 || column == 14) ||
(column == 20 || column == 21) ||
(column == 27 || column == 28) ||
(column == 34 || column == 35) ||
(column == 41 || column == 42)) && (table.getValueAt(row, column) == null)){
setBackground(finde);
}else if (((column == 6 || column == 7) ||
(column == 13 || column == 14) ||
(column == 20 || column == 21) ||
(column == 27 || column == 28) ||
(column == 34 || column == 35) ||
(column == 41 || column == 42)) && (table.getValueAt(row, column) != null)){
setBackground(verd);
}
if (value != null){
// if (Integer.parseInt(value.toString()) == realDay && currentMonth == realMonth && currentYear == realYear){ //Today
// setBackground(new Color(220, 220, 255));
// }
}
setBorder(null);
this.setHorizontalAlignment(SwingConstants.CENTER);
setForeground(Color.black);
return this;
}
Como podria hacerlo?
Gracias!