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();
}
}
}
}
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是没用。
如果要控制大小,可以按上面的方式