import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;public class JCalendar extends JFrame {
private static final long serialVersionUID = 8626726715166262660L;
private JSpinner year;
private JComboBox month;
private JDayTable day;
private AbstractTableModel model;
private Calendar calendar;
private static Color headerBackground = new Color(0xdddddd);
private static Color headerForeground = new Color(0x000000);
private static Color bodyBackground =  new Color(0xeeeeee);
private static Color bodyForeground = new Color(0x000000);
private static Color selectedBackground = new Color(0x66ff66);
private static Color selectedForeground = new Color(0x000000);
private static String monthStr = "一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月";
private static String weekStr = "日,一,二,三,四,五,六";
private static Font font = new Font("宋体",Font.PLAIN,12);
public JCalendar() {
super();
init();
}

private void init() {
setLayout(new BorderLayout()); calendar = Calendar.getInstance();
year = new JSpinner();
year.setSize(100,100);//为什么这里的setSize不起作用呢
year.setEditor(new JSpinner.NumberEditor(year, "0000"));
year.setValue(calendar.get(Calendar.YEAR));
year.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.YEAR, (Integer)year.getValue());
calendar.set(Calendar.DAY_OF_MONTH, 1);
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
refreshView();
}
});

month = new JComboBox(monthStr.split(","));
month.setSize(100,100);//同上:为什么这里的setSize不起作用呢
month.setSelectedIndex(calendar.get(Calendar.MONTH));
month.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.MONTH, month.getSelectedIndex());
int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
refreshView();
}
});


model = new AbstractTableModel() {
private static final long serialVersionUID = -8419866369739797588L;
public int getColumnCount() {
return 7;
}
public int getRowCount() {
return 7;
}
public Object getValueAt(int row, int column) {
if (row == 0) {
return weekStr.split(",")[column];
} else {
row--;
Calendar clone = (Calendar)calendar.clone();
clone.set(Calendar.DAY_OF_MONTH, 1);
int start = clone.get(Calendar.DAY_OF_WEEK) - 1;
int end = clone.getActualMaximum(Calendar.DAY_OF_MONTH);
int position = row * getColumnCount() + column - start + 1;
if (position >= start && position <= end) {
return position;
} else {
return null;
}
}
}
};
day = new JDayTable(model, calendar);
day.setCellSelectionEnabled(true);
day.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
day.setDefaultRenderer(day.getColumnClass(0), new TableCellRenderer(){
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JLabel cell = new JLabel(value==null?"":value.toString());
cell.setOpaque(true);
cell.setFont(font);
cell.setHorizontalAlignment(SwingConstants.CENTER);
if (row == 0) {
cell.setBackground(headerBackground);
cell.setForeground(headerForeground);
} else {
if (isSelected) {
cell.setBackground(selectedBackground);
cell.setForeground(selectedForeground);
} else {
cell.setBackground(bodyBackground);
cell.setForeground(bodyForeground);
}
}
return cell;
}
});
refreshView();

JPanel top = new JPanel(); 
top.add(year, BorderLayout.WEST);
top.add(month, BorderLayout.EAST);

add(top, BorderLayout.NORTH);
add(day, BorderLayout.CENTER);
setVisible(true);
setBounds(100, 100, 250, 200);
}

private void refreshView() {
model.fireTableDataChanged();
day.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH),
calendar.get(Calendar.WEEK_OF_MONTH));
day.setColumnSelectionInterval(
calendar.get(Calendar.DAY_OF_WEEK) - 1, calendar
.get(Calendar.DAY_OF_WEEK) - 1);
showTime();
}

public static void main(String[] args) {
JFrame f = new JCalendar(); 
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
}
@Deprecated
private void showTime() {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
setTitle(df.format(calendar.getTime()));
}
class JDayTable extends JTable {
private static final long serialVersionUID = -7029283290845350929L;
protected Calendar cal;
public JDayTable(TableModel model, Calendar cal) {
super(model);
this.cal = cal;
}
@Override
public void changeSelection(int row, int col,
boolean toggle, boolean extend) {
super.changeSelection(row, col, toggle, extend);
if (row == 0) {
return;
} else {
Object value = getValueAt(row, col);
if (value != null) {
cal.set(Calendar.DAY_OF_MONTH, (Integer)value);
}
showTime();
}
}
}
}

解决方案 »

  1.   

    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSpinner;
    import javax.swing.JTable;
    import javax.swing.ListSelectionModel;
    import javax.swing.SwingConstants;
    import javax.swing.WindowConstants;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.TableModel;public class JCalendar extends JFrame {
    private static final long serialVersionUID = 8626726715166262660L;
    private JSpinner year;
    private JComboBox month;
    private JDayTable day;
    private AbstractTableModel model;
    private Calendar calendar;
    private static Color headerBackground = new Color(0xdddddd);
    private static Color headerForeground = new Color(0x000000);
    private static Color bodyBackground = new Color(0xeeeeee);
    private static Color bodyForeground = new Color(0x000000);
    private static Color selectedBackground = new Color(0x66ff66);
    private static Color selectedForeground = new Color(0x000000);
    private static String monthStr = "一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月";
    private static String weekStr = "日,一,二,三,四,五,六";
    private static Font font = new Font("宋体", Font.PLAIN, 12); public JCalendar() {
    super();
    init();
    } private void init() {
    // setLayout(new BorderLayout());
    setLayout(null);//================here calendar = Calendar.getInstance();
    year = new JSpinner();
    year.setSize(100, 100);// 为什么这里的setSize不起作用呢
    year.setEditor(new JSpinner.NumberEditor(year, "0000"));
    year.setValue(calendar.get(Calendar.YEAR));
    year.addChangeListener(new ChangeListener() {
    public void stateChanged(ChangeEvent e) {
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    calendar.set(Calendar.YEAR, (Integer) year.getValue());
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
    refreshView();
    }
    }); month = new JComboBox(monthStr.split(","));
    month.setSize(100, 100);// 同上:为什么这里的setSize不起作用呢
    month.setSelectedIndex(calendar.get(Calendar.MONTH));
    month.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    calendar.set(Calendar.MONTH, month.getSelectedIndex());
    int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
    refreshView();
    }
    }); model = new AbstractTableModel() {
    private static final long serialVersionUID = -8419866369739797588L; public int getColumnCount() {
    return 7;
    } public int getRowCount() {
    return 7;
    } public Object getValueAt(int row, int column) {
    if (row == 0) {
    return weekStr.split(",")[column];
    } else {
    row--;
    Calendar clone = (Calendar) calendar.clone();
    clone.set(Calendar.DAY_OF_MONTH, 1);
    int start = clone.get(Calendar.DAY_OF_WEEK) - 1;
    int end = clone.getActualMaximum(Calendar.DAY_OF_MONTH);
    int position = row * getColumnCount() + column - start + 1;
    if (position >= start && position <= end) {
    return position;
    } else {
    return null;
    }
    }
    }
    };
    day = new JDayTable(model, calendar);
    day.setCellSelectionEnabled(true);
    day.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    day.setDefaultRenderer(day.getColumnClass(0), new TableCellRenderer() {
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
    boolean hasFocus, int row, int column) {
    JLabel cell = new JLabel(value == null ? "" : value.toString());
    cell.setOpaque(true);
    cell.setFont(font);
    cell.setHorizontalAlignment(SwingConstants.CENTER);
    if (row == 0) {
    cell.setBackground(headerBackground);
    cell.setForeground(headerForeground);
    } else {
    if (isSelected) {
    cell.setBackground(selectedBackground);
    cell.setForeground(selectedForeground);
    } else {
    cell.setBackground(bodyBackground);
    cell.setForeground(bodyForeground);
    }
    }
    return cell;
    }
    });
    refreshView(); JPanel top = new JPanel();
    // ==================here================
    top.setLayout(null);
    // top.setSize(100, 100);
    // top.add(year, BorderLayout.WEST);
    // top.add(month, BorderLayout.EAST);
    top.add(year);
    year.setBounds(1, 2, 60, 30);
    top.add(month);
    month.setBounds(160, 2, 75, 30);// add(top, BorderLayout.NORTH);
    add(top);
    top.setBounds(0, 0, 250, 45);
    // add(day, BorderLayout.CENTER);
    add(day);
    day.setBounds(0, 50, 240, 200);
    setVisible(true);
    // this.pack();
    setBounds(100, 100, 250, 200);
    } private void refreshView() {
    model.fireTableDataChanged();
    day.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH), calendar.get(Calendar.WEEK_OF_MONTH));
    day.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK) - 1, calendar.get(Calendar.DAY_OF_WEEK) - 1);
    showTime();
    } public static void main(String[] args) {
    JFrame f = new JCalendar();
    f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    } @Deprecated
    private void showTime() {
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    setTitle(df.format(calendar.getTime()));
    } class JDayTable extends JTable {
    private static final long serialVersionUID = -7029283290845350929L;
    protected Calendar cal; public JDayTable(TableModel model, Calendar cal) {
    super(model);
    this.cal = cal;
    } @Override
    public void changeSelection(int row, int col, boolean toggle, boolean extend) {
    super.changeSelection(row, col, toggle, extend);
    if (row == 0) {
    return;
    } else {
    Object value = getValueAt(row, col);
    if (value != null) {
    cal.set(Calendar.DAY_OF_MONTH, (Integer) value);
    }
    showTime();
    }
    }
    }
    }
    调了下,好像setSize是没用。
    如果要控制大小,可以按上面的方式