calendario calculo de dias

shagi
26 de Noviembre del 2005
hola nada mas quería decirles que este codigo cuando pones febrero en un año bisiesto pone un dia repetido y no se porque me podrian decir el error ahi les va el codigo repito este codigo no es mio simplemente le eh hecho unas modificaciones y es libre de distribucion

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Font;

public class JCalendar extends JPanel {

protected int yy;

protected int mm, dd;

protected JButton labs[][];

protected int leadGap = 0;

Calendar calendar = new GregorianCalendar();

protected final int thisYear = calendar.get(Calendar.YEAR);

protected final int thisMonth = calendar.get(Calendar.MONTH);

private JButton b0;

private JComboBox monthChoice;

private JComboBox yearChoice;

/**
* Construct a Cal, starting with today.
*/
JCalendar() {
super();
setYYMMDD(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
calendar.get(Calendar.DAY_OF_MONTH));
buildGUI();
recompute();
}

/**
* Construct a Cal, given the leading days and the total days
*
* @exception IllegalArgumentException
* If year out of range
*/
JCalendar(int year, int month, int today) {
super();
setYYMMDD(year, month, today);
buildGUI();
recompute();
}

private void setYYMMDD(int year, int month, int today) {
yy = year;
mm = month;
dd = today;
}

String[] months = { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" };

/** Build the GUI. Assumes that setYYMMDD has been called. */
private void buildGUI() {
getAccessibleContext().setAccessibleDescription(
"Calendar not accessible yet. Sorry!");
setBorder(BorderFactory.createEtchedBorder());

setLayout(new BorderLayout());

JPanel tp = new JPanel();
tp.add(monthChoice = new JComboBox());
for (int i = 0; i < months.length; i++)
monthChoice.addItem(months[i]);
monthChoice.setToolTipText("Meses del año");
monthChoice.setSelectedItem(months[mm]);
monthChoice.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
int i = monthChoice.getSelectedIndex();
if (i >= 0) {
mm = i;
//System.out.println("Month=" + mm);
recompute();
}
}
});
monthChoice.getAccessibleContext().setAccessibleName("Months");
monthChoice.getAccessibleContext().setAccessibleDescription(
"Choose a month of the year");

tp.add(yearChoice = new JComboBox());
yearChoice.setEditable(true);
for (int i = yy - 5; i < yy + 5; i++)
yearChoice.addItem(Integer.toString(i));
yearChoice.setSelectedItem(Integer.toString(yy));
yearChoice.setToolTipText("año");
yearChoice.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
int i = yearChoice.getSelectedIndex();
if (i >= 0) {
yy = Integer.parseInt(yearChoice.getSelectedItem().toString());
// System.out.println("Year=" + yy);
recompute();
}
}
});
add(BorderLayout.CENTER, tp);

JPanel bp = new JPanel();
bp.setLayout(new GridLayout(7, 7));
labs= new JButton[6][7]; // first row is days

b0=new JButton("D");
JButton b1=new JButton("L");
JButton b2=new JButton("M");
JButton b3=new JButton("M");
JButton b4=new JButton("J");
JButton b5=new JButton("V");
JButton b6=new JButton("S");
//b0.setFont(new Font("helvetica", Font.BOLD, 18));
b0.setContentAreaFilled(false);
b1.setContentAreaFilled(false);
b2.setContentAreaFilled(false);
b3.setContentAreaFilled(false);
b4.setContentAreaFilled(false);
b5.setContentAreaFilled(false);
b6.setContentAreaFilled(false);


bp.add(b0);
bp.add(b1);
bp.add(b2);
bp.add(b3);
bp.add(b4);
bp.add(b5);
bp.add(b6);

ActionListener dateSetter = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String num = e.getActionCommand();
if (!num.equals("")) {
// set the current day highlighted
setDayActive(Integer.parseInt(num));
// When this becomes a Bean, you can
// fire some kind of DateChanged event here.
// Also, build a similar daySetter for day-of-week btns.
}
}
};

// Construct all the buttons, and add them.
for (int i = 0; i < 6; i++)
for (int j = 0; j < 7; j++) {
bp.add(labs[i][j] = new JButton(""));
labs[i][j].addActionListener(dateSetter);
labs[i][j].setContentAreaFilled(false);
labs[i][j].setBorderPainted(false);
}

add(BorderLayout.SOUTH, bp);
}

public final static int dom[] = { 31,28,31,30,31,30,31,31,30,31,30,31};

/** Compute which days to put where, in the Cal panel */
protected void recompute() {

if (mm < 0 || mm > 11)
throw new IllegalArgumentException("Month " + mm
+ " bad, must be 0-11");
clearDayActive();
calendar = new GregorianCalendar(yy, mm, dd);

// Compute how much to leave before the first.
// getDay() returns 0 for Sunday, which is just right.
leadGap = new GregorianCalendar(yy, mm, 1).get(Calendar.DAY_OF_WEEK) - 1;
// System.out.println("leadGap = " + leadGap);

int daysInMonth = dom[mm];
if (isLeap(calendar.get(Calendar.YEAR)) && mm > 1)
daysInMonth++;

// Blank out the labels before 1st day of month
for (int i = 0; i <leadGap; i++) {
labs[0][i].setText("");

}

// Fill in numbers for the day of month.
for (int i = 1; i <= daysInMonth; i++) {
JButton b = labs[(leadGap + i - 1) / 7][(leadGap + i - 1) % 7];
b.setText(Integer.toString(i));
}

// 7 days/week * up to 6 rows
for (int i = leadGap + 1 + daysInMonth; i <6*7; i++) {
labs[(i) / 7][(i) % 7].setText("");
}

// Shade current day, only if current month
if (thisYear == yy && mm == thisMonth)
setDayActive(dd); // shade the box for today

// Say we need to be drawn on the screen
repaint();

}

/**
* isLeap() returns true if the given year is a Leap Year.
*
* "a year is a leap year if it is divisible by 4 but not by 100, except
* that years divisible by 400 *are* leap years." -- Kernighan & Ritchie,
* _The C Programming Language_, p 37.
*/
public boolean isLeap(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
return true;
return false;
}

/** Set the year, month, and day */
public void setDate(int yy, int mm, int dd) {
// System.out.println("Cal::setDate");
this.yy = yy;
this.mm = mm; // starts at 0, like Date
this.dd = dd;
recompute();

}

/** Unset any previously highlighted day */
private void clearDayActive() {
JButton b;

// First un-shade the previously-selected square, if any
if (activeDay > 0) {
b = labs[(leadGap + activeDay - 1) / 7][(leadGap + activeDay - 1) % 7];
b.setBackground(b0.getBackground());
b.repaint();
activeDay = -1;
}
}

private int activeDay = -1;

/** Set just the day, on the current month */
public void setDayActive(int newDay) {

clearDayActive();

// Set the new one
if (newDay <= 0)
dd = new GregorianCalendar().get(Calendar.DAY_OF_MONTH);
else
dd = newDay;
// Now shade the correct square
Component square = labs[(leadGap + newDay - 1) / 7][(leadGap + newDay - 1) % 7];
square.setBackground(Color.red);
square.setFont(new Font("helvetica", Font.BOLD, 18));
square.repaint();
activeDay = newDay;
}
public static void main(String args[]) {
JFrame f = new JFrame("Calendario");
Container c = f.getContentPane();
c.setLayout(new FlowLayout());
c.add(new JCalendar());
f.pack();
f.setVisible(true);

}
}