package ZsUtil;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
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.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
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;
/**
*
* YouAreStupid 收集网上靠谱的例子,修改后的Swing日期
* 时间选择器,因为修改时间匆忙,希望有时间的朋友继续改进。
* 例子原作者:zjw
* 修改/完善:YouAreStupid
*/
public class DateChooserJButton extends JButton {
private DateChooser dateChooser = null;
private String preLabel = "";
private String originalText = null;
private SimpleDateFormat sdf = null;
public DateChooserJButton() {
this(getNowDate());
}
public DateChooserJButton(String dateString) {
this();
setText(getDefaultDateFormat(), dateString);
//保存原始是日期时间
initOriginalText(dateString);
}
public DateChooserJButton(SimpleDateFormat df, String dateString) {
this();
setText(df, dateString);
//记忆当前的日期格式化器
this.sdf = df;
//记忆原始日期时间
Date originalDate = null;
try {
originalDate = df.parse(dateString);
} catch (ParseException ex) {
originalDate = getNowDate();
}
initOriginalText(originalDate);
}
public DateChooserJButton(Date date) {
this("", date);
//记忆原始日期时间
initOriginalText(date);
}
public DateChooserJButton(String preLabel, Date date) {
if (preLabel != null) {
this.preLabel = preLabel;
}
setDate(date);
//记忆原始是日期时间
initOriginalText(date);
setBorder(null);
setCursor(new Cursor(Cursor.HAND_CURSOR));
super.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (dateChooser == null) {
dateChooser = new DateChooser();
}
Point p = getLocationOnScreen();
p.y = p.y + 30;
dateChooser.showDateChooser(p);
}
});
}
private static Date getNowDate() {
return Calendar.getInstance().getTime();
}
private static SimpleDateFormat getDefaultDateFormat() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
/**
* 得到当前使用的日期格式化器
* @return 日期格式化器
*/
public SimpleDateFormat getCurrentSimpleDateFormat(){
if(this.sdf != null){
return sdf;
}else{
return getDefaultDateFormat();
}
}
//保存原始是日期时间
private void initOriginalText(String dateString) {
this.originalText = dateString;
}
//保存原始是日期时间
private void initOriginalText(Date date) {
this.originalText = preLabel + getDefaultDateFormat().format(date);
}
/**
* 得到当前记忆的原始日期时间
* @return 当前记忆的原始日期时间(未修改前的日期时间)
*/
public String getOriginalText() {
return originalText;
}
// 覆盖父类的方法
@Override
public void setText(String s) {
Date date;
try {
date = getDefaultDateFormat().parse(s);
} catch (ParseException e) {
date = getNowDate();
}
setDate(date);
}
public void setText(SimpleDateFormat df, String s) {
Date date;
try {
date = df.parse(s);
} catch (ParseException e) {
date = getNowDate();
}
setDate(date);
}
public void setDate(Date date) {
super.setText(preLabel + getDefaultDateFormat().format(date));
}
public Date getDate() {
String dateString = getText().substring(preLabel.length());
try {
SimpleDateFormat currentSdf = getCurrentSimpleDateFormat();
return currentSdf.parse(dateString);
} catch (ParseException e) {
return getNowDate();
}
}
/**
* 覆盖父类的方法使之无效
* @param listener 响应监听器
*/
@Override
public void addActionListener(ActionListener listener) {
}
/**
* 内部类,主要是定义一个JPanel,然后把日历相关的所有内容填入本JPanel,
* 然后再创建一个JDialog,把本内部类定义的JPanel放入JDialog的内容区
*/
private class DateChooser extends JPanel implements ActionListener, ChangeListener {
int startYear = 1980; // 默认【最小】显示年份
int lastYear = 2050; // 默认【最大】显示年份
int width = 390; // 界面宽度
int height = 210; // 界面高度
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按钮文字色
/** 点击DateChooserButton时弹出的对话框,日历内容在这个对话框内 */
JDialog dialog;
JSpinner yearSpin;
JSpinner monthSpin;
JSpinner daySpin;
JSpinner hourSpin;
JSpinner minuteSpin;
JSpinner secondSpin;
JButton[][] daysButton = new JButton[6][7];
DateChooser() {
setLayout(new BorderLayout());
setBorder(new LineBorder(backGroundColor, 2));
setBackground(backGroundColor);
JPanel topYearAndMonth = createYearAndMonthPanal();
add(topYearAndMonth, BorderLayout.NORTH);
JPanel centerWeekAndDay = createWeekAndDayPanal();
add(centerWeekAndDay, BorderLayout.CENTER);
JPanel buttonBarPanel = createButtonBarPanel();
this.add(buttonBarPanel, java.awt.BorderLayout.SOUTH);
}
private JPanel createYearAndMonthPanal() {
Calendar c = getCalendar();
int currentYear = c.get(Calendar.YEAR);
int currentMonth = c.get(Calendar.MONTH) + 1;
int currentHour = c.get(Calendar.HOUR_OF_DAY);
int currentMinute = c.get(Calendar.MINUTE);
int currentSecond = c.get(Calendar.SECOND);
JPanel result = new JPanel();
result.setLayout(new FlowLayout());
result.setBackground(controlLineColor);
yearSpin = new JSpinner(new SpinnerNumberModel(currentYear, startYear, lastYear, 1));
yearSpin.setPreferredSize(new Dimension(48, 20));
ye