package PbuliClass;
|
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.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.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;
|
|
import Frame.TrackPlay;
|
|
/**
|
* ¸ÃÀàÓÃÓÚÑ¡Ôñʱ·ÖÃë
|
* YouAreStupid ÊÕ¼¯ÍøÉÏ¿¿Æ×µÄÀý×Ó£¬Ð޸ĺóµÄSwingÈÕÆÚ
|
* ʱ¼äÑ¡ÔñÆ÷,ÒòΪÐÞ¸Äʱ¼ä´Ò棬ϣÍûÓÐʱ¼äµÄÅóÓѼÌÐø¸Ä½ø¡£
|
* Àý×ÓÔ×÷Õß:ZJW
|
* ÐÞ¸Ä/ÍêÉÆ£ºYouAreStupid
|
*/
|
public class GetDate extends JButton {
|
|
/**
|
*
|
*/
|
private static final long serialVersionUID = 1L;
|
|
private DateChooser dateChooser = null;
|
private String preLabel = "";
|
private String originalText = null;
|
private SimpleDateFormat sdf = null;
|
|
public GetDate() {
|
this(getNowDate());
|
Font f=new Font("΢ÈíÑźÚ",Font.PLAIN,15);//°´Å¥×ÖÌåÉèÖÃ
|
this.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));//Êó±êÖ¸ÔÚ°´Å¥ÉϱäÊÖÐÍ
|
this.setFont(f);
|
this.setForeground(Color.black);
|
this.setBackground(Color.white);
|
}
|
|
public GetDate(String dateString) {
|
this();
|
setText(getDefaultDateFormat(), dateString);
|
//±£´æÔʼµÄÈÕÆÚʱ¼ä
|
initOriginalText(dateString);
|
}
|
|
public GetDate(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 GetDate(Date date) {
|
this("", date);
|
//¼ÇÒäÔʼÈÕÆÚʱ¼ä
|
initOriginalText(date);
|
}
|
|
public GetDate(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µÄÄÚÈÝÇø
|
*/
|
@SuppressWarnings("serial")
|
|
private class DateChooser extends JPanel implements ActionListener, ChangeListener {
|
|
int startYear = 1980; // ĬÈÏ¡¾×îС¡¿ÏÔʾÄê·Ý
|
int lastYear = 2050; // ĬÈÏ¡¾×î´ó¡¿ÏÔʾÄê·Ý
|
int width = 390; // ½çÃæ¿í¶È
|
int height = 300; // ½çÃæ¸ß¶È
|
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; // ¿ØÖÆÌõ±êÇ©ÎÄ×ÖÉ«
|
@SuppressWarnings("unused")
|
Color rbFontColor = Color.white; // RoundBoxÎÄ×ÖÉ«
|
@SuppressWarnings("unused")
|
Color rbBorderColor = Color.red; // RoundBox±ß¿òÉ«
|
@SuppressWarnings("unused")
|
Color rbButtonColor = Color.pink; // RoundBox°´Å¥É«
|
@SuppressWarnings("unused")
|
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, 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));
|
yearSpin.setName("Year");
|
yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, "####"));
|
yearSpin.addChangeListener(this);
|
result.add(yearSpin);
|
|
JLabel yearLabel = new JLabel("Äê");
|
yearLabel.setForeground(controlTextColor);
|
result.add(yearLabel);
|
|
monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth, 1, 12, 1));
|
monthSpin.setPreferredSize(new Dimension(35, 20));
|
monthSpin.setName("Month");
|
monthSpin.addChangeListener(this);
|
result.add(monthSpin);
|
|
JLabel monthLabel = new JLabel("ÔÂ");
|
monthLabel.setForeground(controlTextColor);
|
result.add(monthLabel);
|
|
//Èç¹ûÕâÀïÒªÄܹ»Ñ¡Ôñ,»áÒªÅжϺܶණÎ÷,±ÈÈçÿ¸öÔ·ֱðÓɶàÉÙÈÕ,ÒÔ¼°ÈòÄêÎÊÌâ.ËùÒÔ,¾Í¸É´à°ÑEnableÉèΪfalse
|
daySpin = new JSpinner(new SpinnerNumberModel(currentMonth, 1, 31, 1));
|
daySpin.setPreferredSize(new Dimension(35, 20));
|
daySpin.setName("Day");
|
daySpin.addChangeListener(this);
|
daySpin.setEnabled(false);
|
daySpin.setToolTipText("ÇëÏÂÏÂÃæµÄÈÕÀúÃæ°åÖнøÐÐÑ¡ÔñÄÄÒ»Ì죡");
|
result.add(daySpin);
|
|
JLabel dayLabel = new JLabel("ÈÕ");
|
dayLabel.setForeground(controlTextColor);
|
result.add(dayLabel);
|
|
hourSpin = new JSpinner(new SpinnerNumberModel(currentHour, 0, 23, 1));
|
hourSpin.setPreferredSize(new Dimension(35, 20));
|
hourSpin.setName("Hour");
|
hourSpin.addChangeListener(this);
|
result.add(hourSpin);
|
|
JLabel hourLabel = new JLabel("ʱ");
|
hourLabel.setForeground(controlTextColor);
|
result.add(hourLabel);
|
|
minuteSpin = new JSpinner(new SpinnerNumberModel(currentMinute, 0, 59, 1));
|
minuteSpin.setPreferredSize(new Dimension(35, 20));
|
minuteSpin.setName("Minute");
|
minuteSpin.addChangeListener(this);
|
result.add(minuteSpin);
|
|
JLabel minuteLabel = new JLabel("·Ö");
|
hourLabel.setForeground(controlTextColor);
|
result.add(minuteLabel);
|
|
secondSpin = new JSpinner(new SpinnerNumberModel(currentSecond, 0, 59, 1));
|
secondSpin.setPreferredSize(new Dimension(35, 20));
|
secondSpin.setName("Second");
|
secondSpin.addChangeListener(this);
|
result.add(secondSpin);
|
|
JLabel secondLabel = new JLabel("Ãë");
|
hourLabel.setForeground(controlTextColor);
|
result.add(secondLabel);
|
|
return result;
|
}
|
|
private JPanel createWeekAndDayPanal() {
|
String colname[] = {"ÈÕ", "Ò»", "¶þ", "Èý", "ËÄ", "Îå", "Áù"};
|
JPanel result = new JPanel();
|
// ÉèÖù̶¨×ÖÌ壬ÒÔÃâµ÷Óû·¾³¸Ä±äÓ°Ïì½çÃæÃÀ¹Û
|
result.setFont(new Font("ËÎÌå", Font.PLAIN, 12));
|
result.setLayout(new GridLayout(7,7));
|
result.setBackground(Color.white);
|
JLabel cell;
|
|
for (int i = 0; i < 7; i++) {
|
cell = new JLabel(colname[i]);
|
cell.setHorizontalAlignment(JLabel.CENTER);
|
if (i == 0 || i == 6) {
|
cell.setForeground(weekendFontColor);
|
} else {
|
cell.setForeground(weekFontColor);
|
}
|
result.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.CENTER);
|
numberButton.setActionCommand(String.valueOf(actionCommandId));
|
numberButton.addActionListener(this);
|
numberButton.setBackground(palletTableColor);
|
numberButton.setForeground(dateFontColor);
|
if (j == 0 || j == 6) {
|
numberButton.setForeground(weekendFontColor);
|
} else {
|
numberButton.setForeground(dateFontColor);
|
}
|
daysButton[i][j] = numberButton;
|
result.add(numberButton);
|
actionCommandId++;
|
}
|
}
|
|
return result;
|
}
|
|
/** µÃµ½DateChooserButtonµÄµ±Ç°text£¬±¾·½·¨ÊÇΪ°´Å¥Ê¼þÄäÃûÀà×¼±¸µÄ¡£ */
|
public String getTextOfDateChooserButton() {
|
return getText();
|
}
|
|
/** »Ö¸´DateChooserButtonµÄÔʼÈÕÆÚʱ¼ätext£¬±¾·½·¨ÊÇΪ°´Å¥Ê¼þÄäÃûÀà×¼±¸µÄ¡£ */
|
public void restoreTheOriginalDate() {
|
String originalText = getOriginalText();
|
setText(originalText);
|
}
|
|
private JPanel createButtonBarPanel() {
|
JPanel panel = new JPanel();
|
panel.setLayout(new GridLayout(1, 2));
|
|
JButton ok = new JButton("È·¶¨");
|
ok.setBackground(Color.white);
|
ok.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));//Êó±êÖ¸ÔÚ°´Å¥ÉϱäÊÖÐÍ
|
ok.addActionListener(new ActionListener() {
|
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
//¼ÇÒäÔʼÈÕÆÚʱ¼ä
|
initOriginalText(getTextOfDateChooserButton());
|
//Òþ²ØÈÕÀú¶Ô»°¿ò
|
TrackPlay.setFalstchoose(0);
|
dialog.setVisible(false);
|
}
|
});
|
panel.add(ok);
|
|
JButton cancel = new JButton("È¡Ïû");
|
cancel.setBackground(Color.white);
|
cancel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));//Êó±êÖ¸ÔÚ°´Å¥ÉϱäÊÖÐÍ
|
cancel.addActionListener(new ActionListener() {
|
|
@Override
|
public void actionPerformed(ActionEvent e) {
|
//»Ö¸´ÔʼµÄÈÕÆÚʱ¼ä
|
restoreTheOriginalDate();
|
//Òþ²ØÈÕÀú¶Ô»°¿ò
|
dialog.setVisible(false);
|
}
|
});
|
|
panel.add(cancel);
|
return panel;
|
}
|
|
private JDialog createDialog(Frame owner) {
|
JDialog result = new JDialog(owner, "ÈÕÆÚʱ¼äÑ¡Ôñ", true);
|
result.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
|
result.getContentPane().add(this, BorderLayout.CENTER);
|
result.pack();
|
result.setSize(width, height);
|
return result;
|
}
|
|
void showDateChooser(Point position) {
|
Frame owner = (Frame) SwingUtilities.getWindowAncestor(GetDate.this);
|
if (dialog == null || dialog.getOwner() != owner) {
|
dialog = createDialog(owner);
|
}
|
dialog.setLocation(getAppropriateLocation(owner, position));
|
flushWeekAndDay();
|
dialog.setVisible(true);
|
}
|
|
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;
|
}
|
|
private Calendar getCalendar() {
|
Calendar result = Calendar.getInstance();
|
result.setTime(getDate());
|
return result;
|
}
|
|
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 getSelectedMinite() {
|
return ((Integer) minuteSpin.getValue()).intValue();
|
}
|
|
private int getSelectedSecond() {
|
return ((Integer) secondSpin.getValue()).intValue();
|
}
|
|
private void dayColorUpdate(boolean isOldDay) {
|
Calendar c = getCalendar();
|
int day = c.get(Calendar.DAY_OF_MONTH);
|
c.set(Calendar.DAY_OF_MONTH, 1);
|
int actionCommandId = day - 2 + c.get(Calendar.DAY_OF_WEEK);
|
int i = actionCommandId / 7;
|
int j = actionCommandId % 7;
|
if (isOldDay) {
|
daysButton[i][j].setForeground(dateFontColor);
|
} else {
|
daysButton[i][j].setForeground(todayBackColor);
|
}
|
}
|
|
private void flushWeekAndDay() {
|
Calendar c = getCalendar();
|
c.set(Calendar.DAY_OF_MONTH, 1);
|
int maxDayNo = c.getActualMaximum(Calendar.DAY_OF_MONTH);
|
int dayNo = 2 - c.get(Calendar.DAY_OF_WEEK);
|
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);
|
}
|
|
/**
|
* Ñ¡ÔñÈÕÆÚʱµÄÏìӦʼþ
|
*/
|
@Override
|
public void stateChanged(ChangeEvent e) {
|
JSpinner source = (JSpinner) e.getSource();
|
Calendar c = getCalendar();
|
if (source.getName().equals("Hour")) {
|
c.set(Calendar.HOUR_OF_DAY, getSelectedHour());
|
setDate(c.getTime());
|
return;
|
}
|
if (source.getName().equals("Minute")) {
|
c.set(Calendar.MINUTE, getSelectedMinite());
|
setDate(c.getTime());
|
return;
|
}
|
if (source.getName().equals("Second")) {
|
c.set(Calendar.SECOND, getSelectedSecond());
|
setDate(c.getTime());
|
return;
|
}
|
|
dayColorUpdate(true);
|
|
if (source.getName().equals("Year")) {
|
c.set(Calendar.YEAR, getSelectedYear());
|
} else if (source.getName().equals("Month")) {
|
c.set(Calendar.MONTH, getSelectedMonth() - 1);
|
}
|
setDate(c.getTime());
|
flushWeekAndDay();
|
}
|
|
/**
|
* Ñ¡ÔñÈÕÆÚʱµÄÏìӦʼþ
|
*/
|
@Override
|
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 c = getCalendar();
|
c.set(Calendar.DAY_OF_MONTH, newDay);
|
setDate(c.getTime());
|
//°ÑdaySpinÖеÄÖµÒ²±äÁË
|
daySpin.setValue(Integer.valueOf(newDay));
|
}
|
}
|
|
}
|