📄 datechooser.java
字号:
package bookTrading.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
/**
* 日期时间选择控件
* <p>
* usage:
* <pre>
* ......
* DateChooser dateChooser = null;
* ......
* DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
* JFormattedTextField deadlineField = new JFormattedTextField(dateFormat);
* ......
* JButton b = new JButton("Set");
* b.addActionListener(new ActionListener() {
* public void actionPerformed(ActionEvent ev) {
* if (dateChooser == null) {
* dateChooser = new DateChooser(deadlineField);
* }
* Point p = getLocationOnScreen();
* p.y = p.y+30;
* dateChooser.showDialog("DateTime Chooser", p);
* }
* });
* </pre>
* @author 刘文俊
*
*/
public class DateChooser extends JPanel implements ActionListener, ChangeListener {
public DateChooser(JFormattedTextField dateField) {
this.dateField = dateField;
setLayout(new BorderLayout());
setBorder(new LineBorder(backGroundColor, 2));
setBackground(backGroundColor);
calendar = GregorianCalendar.getInstance();
JPanel topYearAndMonth = createYMHMSPanel();
add(topYearAndMonth, BorderLayout.NORTH);
JPanel centerWeekAndDay = createWeekAndDayPanel();
add(centerWeekAndDay, BorderLayout.CENTER);
}
private JPanel createYMHMSPanel(){
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.setBackground(controlLineColor);
int currentYear = calendar.get(Calendar.YEAR);
yearSpin = new JSpinner(new SpinnerNumberModel(currentYear,
startYear, lastYear, 1));
yearSpin.setPreferredSize(new Dimension(48, 20));
yearSpin.setName("Year");
yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####"));
yearSpin.addChangeListener(this);
panel.add(yearSpin);
JLabel yearLabel = new JLabel("Year");
yearLabel.setForeground(controlTextColor);
panel.add(yearLabel);
int currentMonth = calendar.get(Calendar.MONTH) + 1;
monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth,
1, 12, 1));
monthSpin.setPreferredSize(new Dimension(35, 20));
monthSpin.setName("Month");
monthSpin.addChangeListener(this);
panel.add(monthSpin);
JLabel monthLabel = new JLabel("Month");
monthLabel.setForeground(controlTextColor);
panel.add(monthLabel);
int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
hourSpin = new JSpinner(new SpinnerNumberModel(currentHour,
0, 23, 1));
hourSpin.setPreferredSize(new Dimension(35, 20));
hourSpin.setName("Hour");
hourSpin.addChangeListener(this);
panel.add(hourSpin);
JLabel seperatorLabel = new JLabel(":");
seperatorLabel.setForeground(controlTextColor);
panel.add(seperatorLabel);
int currentMinute = calendar.get(Calendar.MINUTE);
minuteSpin = new JSpinner(new SpinnerNumberModel(currentMinute,
0, 59, 1));
minuteSpin.setPreferredSize(new Dimension(35, 20));
minuteSpin.setName("Minute");
minuteSpin.addChangeListener(this);
panel.add(minuteSpin);
seperatorLabel = new JLabel(":");
seperatorLabel.setForeground(controlTextColor);
panel.add(seperatorLabel);
int currentSecond = calendar.get(Calendar.SECOND);
secondSpin = new JSpinner(new SpinnerNumberModel(currentSecond,
0, 59, 1));
secondSpin.setPreferredSize(new Dimension(35, 20));
secondSpin.setName("Second");
secondSpin.addChangeListener(this);
panel.add(secondSpin);
return panel;
}
private JPanel createWeekAndDayPanel() {
String colname[] = {"SUN", "MON", "TUE",
"WEN", "THU", "FRI", "SAT"};
JPanel panel = new JPanel();
// 设置固定字体,以免调用环境改变影响界面美观
panel.setFont(new Font("SansSerif", Font.PLAIN, 12));
panel.setLayout(new GridLayout(7, 7));
panel.setBackground(Color.white);
JLabel cell = null;
for(int i = 0; i < 7; i++) {
cell = new JLabel(colname[i]);
cell.setHorizontalAlignment(JLabel.RIGHT);
if (i == 0 || i == 6)
cell.setForeground(weekendFontColor);
else
cell.setForeground(weekFontColor);
panel.add(cell);
}
int actionCommandId = 0;
for(int i = 0; i < 6; i++) {
for(int j = 0; j < 7; j++) {
JButton numberButton = new JButton();
numberButton.setBorder(null);
numberButton.setHorizontalAlignment(SwingConstants.RIGHT);
numberButton.setActionCommand(
String.valueOf(actionCommandId));
numberButton.addActionListener(this) ;
numberButton.setBackground(palletTableColor);
if (j == 0 || j == 6)
numberButton.setForeground(weekendFontColor);
else
numberButton.setForeground(dateFontColor);
daysButton[i][j] = numberButton;
panel.add(numberButton);
actionCommandId++;
}
}
return panel;
}
private JDialog createDialog(String title) {
Window window = SwingUtilities.getWindowAncestor(dateField);
JDialog dialog = null;
if (window instanceof Frame) {
dialog = new DateChooserDialog(this, (Frame)window, title);
} else {
dialog = new DateChooserDialog(this, (Dialog)window, title);
}
dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
dialog.getContentPane().add(this, BorderLayout.CENTER);
dialog.pack();
dialog.setSize(width, height);
return dialog;
}
Point getAppropriateLocation(Frame owner ,Point position) {
Point result = new Point(position);
Point p = owner.getLocation();
int offsetX = (position.x + width) - (p.x + owner.getWidth());
int offsetY = (position.y + height) - (p.y + owner.getHeight());
if (offsetX > 0) {
result.x -= offsetX;
}
if (offsetY > 0) {
result.y -= offsetY;
}
return result;
}
void setDateField() {
dateField.setValue(calendar.getTime());
}
public void showDialog(String title, Point position) {
Frame owner =(Frame)SwingUtilities.getWindowAncestor(dateField);
if (dialog == null || dialog.getOwner()!= owner)
dialog = createDialog(title);
dialog.setLocation(getAppropriateLocation(owner, position));
flushCalendar();
dialog.setVisible(true);
}
private void flushCalendar() {
calendar.setTime((Date)dateField.getValue());
int currentYear = calendar.get(Calendar.YEAR);
yearSpin.setValue(currentYear);
int currentMonth = calendar.get(Calendar.MONTH) + 1;
monthSpin.setValue(currentMonth);
int currentHour = calendar.get(Calendar.HOUR_OF_DAY);
hourSpin.setValue(currentHour);
int currentMinute = calendar.get(Calendar.MINUTE);
minuteSpin.setValue(currentMinute);
int currentSecond = calendar.get(Calendar.SECOND);
secondSpin.setValue(currentSecond);
dayColorUpdate(true);
flushWeekAndDay();
}
private void dayColorUpdate(boolean isOldDay) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
int actionCommandId = day - 2 + calendar.get(Calendar.DAY_OF_WEEK);
calendar.set(Calendar.DAY_OF_MONTH, day);
int i = actionCommandId / 7;
int j = actionCommandId % 7;
if (isOldDay == true) {
if (j == 0 || j == 6)
daysButton[i][j].setForeground(weekendFontColor);
else
daysButton[i][j].setForeground(dateFontColor);
}
else
daysButton[i][j].setForeground(todayBackColor);
}
private void flushWeekAndDay() {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
int maxDayNo = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int dayNo = 2 - calendar.get(Calendar.DAY_OF_WEEK);
calendar.set(Calendar.DAY_OF_MONTH, day);
for(int i = 0; i < 6; i++) {
for(int j = 0; j < 7; j++) {
String s = "";
if (dayNo >= 1 && dayNo <= maxDayNo)
s = String.valueOf(dayNo);
daysButton[i][j].setText(s);
dayNo++;
}
}
dayColorUpdate(false);
}
private int getSelectedYear() {
return ((Integer)yearSpin.getValue()).intValue();
}
private int getSelectedMonth() {
return ((Integer)monthSpin.getValue()).intValue();
}
private int getSelectedHour() {
return ((Integer)hourSpin.getValue()).intValue();
}
private int getSelectedMinute() {
return ((Integer)minuteSpin.getValue()).intValue();
}
private int getSelectedSecond() {
return ((Integer)secondSpin.getValue()).intValue();
}
public void stateChanged(ChangeEvent e) {
JSpinner source =(JSpinner)e.getSource() ;
if (source.getName().equals("Second")) {
calendar.set(Calendar.SECOND, getSelectedSecond());
return;
}
if (source.getName().equals("Minute")) {
calendar.set(Calendar.MINUTE, getSelectedMinute());
return;
}
if (source.getName().equals("Hour")) {
calendar.set(Calendar.HOUR_OF_DAY, getSelectedHour());
return;
}
dayColorUpdate(true);
if (source.getName().equals("Year"))
calendar.set(Calendar.YEAR, getSelectedYear());
else
calendar.set(Calendar.MONTH, getSelectedMonth() - 1);
flushWeekAndDay();
}
public void actionPerformed(ActionEvent e) {
JButton source =(JButton)e.getSource() ;
if (source.getText().length() == 0)
return;
dayColorUpdate(true);
source.setForeground(todayBackColor);
int newDay = Integer.parseInt(source.getText());
calendar.set(Calendar.DAY_OF_MONTH, newDay);
}
int startYear = 1980; // 默认【最小】显示年份
int lastYear = 2050; // 默认【最大】显示年份
int width = 320; // 界面宽度
int height = 200; // 界面高度
Color backGroundColor = Color.gray; // 底色
// 月历表格配色----------------//
Color palletTableColor = Color.white; // 日历表底色
Color todayBackColor = Color.orange; // 今天背景色
Color weekFontColor = Color.blue; // 星期文字色
Color dateFontColor = Color.black; // 日期文字色
Color weekendFontColor = Color.red; // 周末文字色
// 控制条配色------------------//
Color controlLineColor = Color.pink; // 控制条底色
Color controlTextColor = Color.white; // 控制条标签文字色
Color rbFontColor = Color.white; // RoundBox文字色
Color rbBorderColor = Color.red; // RoundBox边框色
Color rbButtonColor = Color.pink; // RoundBox按钮色
Color rbBtFontColor = Color.red; // RoundBox按钮文字色
JDialog dialog;
JSpinner yearSpin;
JSpinner monthSpin;
JButton[][] daysButton = new JButton[6][7];
JSpinner hourSpin;
JSpinner minuteSpin;
JSpinner secondSpin;
Calendar calendar = null;
JFormattedTextField dateField;
private class DateChooserDialog extends JDialog {
DateChooserDialog(DateChooser dateChooser, Frame frame, String title) {
super(frame, title, true);
this.dateChooser = dateChooser;
}
DateChooserDialog(DateChooser dateChooser, Dialog dialog, String title) {
super(dialog, title, true);
this.dateChooser = dateChooser;
}
public void hide() {
dateChooser.setDateField();
super.hide();
}
private DateChooser dateChooser;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -