datechooserjbutton.java
来自「java编的时间日期选择控件」· Java 代码 · 共 439 行
JAVA
439 行
import java.util.Date;
import java.util.Calendar;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException ;
import java.awt.Color ;
import java.awt.Font;
import java.awt.Point ;
import java.awt.Dimension ;
import java.awt.BorderLayout ;
import java.awt.FlowLayout ;
import java.awt.GridLayout ;
import java.awt.Component ;
import java.awt.Cursor ;
import java.awt.Frame ;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
//import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JSpinner ;
import javax.swing.JSpinner.NumberEditor ;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;
import javax.swing.SwingConstants ;
import javax.swing.event.ChangeListener ;
import javax.swing.event.ChangeEvent ;
import javax.swing.border.LineBorder ;
public class DateChooserJButton extends JButton
{
private DateChooser dateChooser = null;
private String preLabel = "";
Mail_LogForm mail_log = null;
public DateChooserJButton()
{
this(getNowDate(), null);
}
public DateChooserJButton(Mail_LogForm mlf)
{
this(getNowDate(),mlf);
}
public DateChooserJButton(SimpleDateFormat df, String dateString)
{
this();
setText(df, dateString);
}
public DateChooserJButton(Date date, Mail_LogForm mlf)
{
this("", date,mlf);
}
public DateChooserJButton(String preLabel, Date date, Mail_LogForm mlf)
{
this.mail_log = mlf;
if (preLabel != null) this.preLabel = preLabel;
setDate(date);
setBorder(null);
setCursor(new Cursor(Cursor.HAND_CURSOR));
super.addActionListener(new ActionListener()
{
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时
}
//覆盖父类的方法
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
{
return getDefaultDateFormat().parse(dateString);
}
catch (ParseException e)
{
return getNowDate();
}
}
//覆盖父类的方法使之无效
public void addActionListener(ActionListener listener)
{
}
private class DateChooser extends JPanel implements ActionListener, ChangeListener
{
int startYear = 1980; //默认【最小】显示年份
int lastYear = 2050; //默认【最大】显示年份
int width = 200; //界面宽度
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;
//JSpinner hourSpin;
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);
}
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);
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);
//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);
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.RIGHT);
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.RIGHT);
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;
}
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(DateChooserJButton.this);
if (dialog == null || dialog.getOwner() != owner) dialog = createDialog(owner);
dialog.setLocation(getAppropriateLocation(owner, position));
flushWeekAndDay();
dialog.show();
}
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 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);
}
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;
//}
dayColorUpdate(true);
if (source.getName().equals("Year"))
c.set(Calendar.YEAR, getSelectedYear());
else
// (source.getName().equals("Month"))
c.set(Calendar.MONTH, getSelectedMonth() - 1);
setDate(c.getTime());
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 c = getCalendar();
c.set(Calendar.DAY_OF_MONTH, newDay);
setDate(c.getTime());
mail_log.showtable();
this.dialog.dispose();
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?