package com.ycl.api.YS.util;
|
|
|
import javax.swing.*;
|
import javax.swing.border.LineBorder;
|
import javax.swing.event.ChangeEvent;
|
import javax.swing.event.ChangeListener;
|
import java.awt.*;
|
import java.awt.event.*;
|
import java.text.SimpleDateFormat;
|
import java.util.Calendar;
|
import java.util.Date;
|
|
public class DateChooser extends JPanel
|
{
|
|
private int width = 200 ; // 日期控件的宽度
|
private int height = 220 ; // 日期控件的高度
|
|
private GridBagLayout gridBagLayout1 = new GridBagLayout();
|
public JTextField jTextFieldDate = new JTextField();
|
private DateChooserButton btnChoose = new DateChooserButton( " ▼ " ); // ▼是指:▼下拉箭头的unicode码
|
private String parten;
|
private Container owner;
|
private int length = 140 ;
|
|
|
/**
|
* @wbp.parser.constructor
|
*/
|
public DateChooser(Container owner, int length) {
|
this .owner = owner;
|
this .parten = " yyyy-MM-dd HH:mm:ss " ;
|
this .length = length;
|
try {
|
init();
|
}
|
catch (Exception ex) {
|
ex.printStackTrace();
|
}
|
}
|
/* *
|
* 根据一个所有者和一个日期的显示格式构造一个DateChooser对象。
|
*/
|
public DateChooser(Container owner, String partten, int length) {
|
this .owner = owner;
|
this .parten = partten;
|
this .length = length;
|
try {
|
init();
|
}
|
catch (Exception ex) {
|
ex.printStackTrace();
|
}
|
}
|
/* *
|
* 根据一个所有者和一个日期的显示格式构造一个DateChooser对象。
|
*/
|
public DateChooser(Container owner, String partten) {
|
this .owner = owner;
|
this .parten = partten;
|
try {
|
init();
|
}
|
catch (Exception ex) {
|
ex.printStackTrace();
|
}
|
|
}
|
/* *
|
* 以缺省的partten构建DateChooser对象
|
* 日期选择框的所有者必须是Frame或者是JFrame对象。
|
*/
|
public DateChooser(Container owner) {
|
this .owner = owner;
|
this .parten = " yyyy-MM-dd HH:mm:ss" ;
|
try {
|
init();
|
}
|
catch (Exception ex) {
|
ex.printStackTrace();
|
}
|
}
|
|
/* *
|
* 系统初始化
|
* @throws Exception
|
*/
|
private void init() throws Exception {
|
jTextFieldDate.setColumns(10);
|
jTextFieldDate.setEditable(true);
|
jTextFieldDate.setEnabled(true);
|
jTextFieldDate.setToolTipText( " 单击右边的按钮即可选择日期 " );
|
btnChoose.setToolTipText( " 单击即可选择日期 " );
|
this .setLayout(gridBagLayout1);
|
// dateField.setEditable( false );
|
btnChoose.addActionListener( new ActionListener() {
|
public void actionPerformed(ActionEvent e) {
|
DateChooser. this .btnChoose_actionPerformed(e);
|
}
|
});
|
Date date = new Date();
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(parten);
|
this .setText(simpleDateFormat.format(date));
|
this .add(jTextFieldDate, new GridBagConstraints( 0 , 0 , 1 , 1 , 20.0 , 0.0
|
, GridBagConstraints.CENTER,
|
GridBagConstraints.NONE,
|
new Insets( 0 , 0 , 0 , 0 ), 60, 0 ));
|
this .add(btnChoose, new GridBagConstraints( 1 , 0 , 1 , 1 , 0.0 , 0.0
|
, GridBagConstraints.CENTER, GridBagConstraints.NONE,
|
new Insets( 0 , 0 , 0 , 0 ), 0 , 0 ));
|
}
|
public void setToolTipText(String text) {
|
jTextFieldDate.setToolTipText(text);
|
jTextFieldDate.setToolTipText(text);
|
}
|
/* *
|
* 下拉按钮的事件处理
|
* @param e ActionEvent
|
*/
|
public void btnChoose_actionPerformed(ActionEvent e) {
|
Rectangle r = jTextFieldDate.getBounds();
|
Point pOnScreen = jTextFieldDate.getLocationOnScreen();
|
|
Point result = new Point(pOnScreen.x, pOnScreen.y+20 );
|
// Point powner = owner.getLocation();
|
// int offsetX = (pOnScreen.x + width) - (powner.x + owner.getWidth());
|
// int offsetY = (pOnScreen.y + r.height + height) -
|
// (powner.y + owner.getHeight());
|
//
|
// if (offsetX > 0 ) {
|
// result.x -= offsetX;
|
// }
|
//
|
// if (offsetY > 0 ) {
|
// result.y -= height + r.height;
|
// }
|
|
JDialog dateFrame = new JDialog();
|
dateFrame.setModal( false );
|
dateFrame.setUndecorated( true );
|
dateFrame.setLocation(result);
|
dateFrame.setSize(width, height);
|
|
dateFrame.addWindowListener( new WindowAdapter() {
|
// 在任意的非日期选择区单击,则日期选择组件将变为非活动状态,自动释放资源。
|
public void windowDeactivated(WindowEvent e) {
|
JDialog f = (JDialog) e.getSource();
|
f.dispose();
|
}
|
});
|
DatePanel datePanel = new DatePanel(dateFrame, parten);
|
dateFrame.getContentPane().setLayout( new BorderLayout());
|
dateFrame.getContentPane().add(datePanel);
|
dateFrame.setVisible( true );
|
}
|
/* *
|
* 得到日期控件中的值
|
* @return String
|
*/
|
public String getText() {
|
return this .jTextFieldDate.getText();
|
}
|
/* *
|
* 设置文本域的值
|
* @param text String
|
*/
|
public void setText(String text) {
|
this .jTextFieldDate.setText(text);
|
}
|
/* *
|
* 该方法非常有用,是外部直接访问的TextField对象。
|
* @return JTextField
|
*/
|
public JTextField getDateField() {
|
return jTextFieldDate;
|
}
|
/* *
|
* 内部类,日期选择控件的主体,封装了所有日期选择的内容,主要是一个Panel
|
*/
|
class DatePanel
|
extends JPanel implements MouseListener,
|
ChangeListener {
|
|
int startYear = 1970 ; // 默认【最小】显示年份
|
int lastYear = 2050 ; // 默认【最大】显示年份
|
|
Color backGroundColor = Color.gray; // 底色
|
// 月历表格配色---------------- //
|
Color palletTableColor = Color.white; // 日历表底色
|
Color weekFontColor = Color.blue; // 星期文字色
|
Color dateFontColor = Color.black; // 日期文字色
|
Color weekendFontColor = Color.red; // 周末文字色
|
Color moveButtonColor = Color.GREEN; // 鼠标移动的日历底色
|
Color todayBtnColor = Color.pink; // 今天的日历底色
|
// 控制条配色------------------ //
|
Color controlLineColor = Color.pink; // 控制条底色
|
Color controlTextColor = Color.white; // 控制条标签文字色
|
|
JSpinner yearSpin;
|
JSpinner monthSpin;
|
JSpinner hourSpin;
|
JButton[][] daysButton = new JButton[ 6 ][ 7 ];
|
|
JDialog f;
|
|
JPanel dayPanel = new JPanel(); // 日期panel
|
JPanel yearPanel = new JPanel();
|
|
Calendar calendar = Calendar.getInstance();
|
String pattern;
|
|
/* *
|
* 日期选择控件放在了非模态对话框中
|
*/
|
public DatePanel(JDialog target, String pattern) {
|
super();
|
|
this .f = target;
|
this .pattern = pattern;
|
|
setLayout( new BorderLayout());
|
setBorder( new LineBorder(backGroundColor, 2 ));
|
setBackground(backGroundColor);
|
initButton(); // 初始化放置日期的按钮。
|
createYearAndMonthPanal(); //
|
this .flushWeekAndDayPanal(calendar); // 之前必须先保证放置日期的按钮已经初始化。
|
this .setLayout( new BorderLayout());
|
this .add(yearPanel, BorderLayout.NORTH);
|
this .add(dayPanel, BorderLayout.CENTER);
|
}
|
|
/* *
|
* 日期选择控件的按钮初始化
|
*/
|
private void initButton() {
|
int actionCommandId = 1 ;
|
for ( int i = 0 ; i < 6 ; i ++ ) {
|
for ( int j = 0 ; j < 7 ; j ++ ) {
|
JButton numberButton = new JButton();
|
numberButton.setBorder(BorderFactory.createEmptyBorder());
|
numberButton.setHorizontalAlignment(SwingConstants.CENTER);
|
numberButton.setActionCommand(String.valueOf(
|
actionCommandId));
|
|
numberButton.addMouseListener( this );
|
|
numberButton.setBackground(palletTableColor);
|
numberButton.setForeground(dateFontColor);
|
numberButton.setText(String.valueOf(actionCommandId));
|
numberButton.setPreferredSize( new Dimension( 25 , 25 ));
|
daysButton[i][j] = numberButton;
|
actionCommandId ++ ;
|
}
|
}
|
}
|
private Date getNowDate() {
|
return Calendar.getInstance().getTime();
|
}
|
private Calendar getNowCalendar() {
|
Calendar result = Calendar.getInstance();
|
return result;
|
}
|
private Date getSelectDate() {
|
return calendar.getTime();
|
}
|
|
/* *
|
* 创建年月日的面板
|
*/
|
private void createYearAndMonthPanal() {
|
Calendar c = getNowCalendar();
|
int currentYear = c. get (Calendar.YEAR);
|
int currentMonth = c. get (Calendar.MONTH) + 1 ;
|
int currentHour = c. get (Calendar.DAY_OF_MONTH);
|
yearSpin = new JSpinner( new SpinnerNumberModel(
|
currentYear,
|
startYear, lastYear, 1 ));
|
monthSpin = new JSpinner( new SpinnerNumberModel(
|
currentMonth, 1 , 12 ,
|
1 ));
|
// hourSpin = new JSpinner( new javax.swing.SpinnerNumberModel(
|
// currentHour, 0 , 23 ,
|
// 1 ));
|
|
yearPanel.setLayout( new FlowLayout());
|
yearPanel.setBackground(controlLineColor);
|
|
yearSpin.setPreferredSize( new Dimension( 48 , 20 ));
|
yearSpin.setName( " Year " );
|
yearSpin.setEditor( new JSpinner.NumberEditor(yearSpin, " #### " ));
|
yearSpin.addChangeListener( this );
|
yearPanel.add(yearSpin);
|
|
JLabel yearLabel = new JLabel( " 年 " );
|
yearLabel.setForeground(controlTextColor);
|
yearPanel.add(yearLabel);
|
|
monthSpin.setPreferredSize( new Dimension( 35 , 20 ));
|
monthSpin.setName( " Month " );
|
monthSpin.addChangeListener( this );
|
yearPanel.add(monthSpin);
|
|
JLabel monthLabel = new JLabel( " 月 " );
|
monthLabel.setForeground(controlTextColor);
|
yearPanel.add(monthLabel);
|
|
}
|
/* *
|
* 根据日期刷新显示面板
|
*/
|
private void flushWeekAndDayPanal(Calendar c) {
|
// c.set
|
c. set (Calendar.DAY_OF_MONTH, 1 );
|
c.setFirstDayOfWeek( 0 );
|
int firstdayofWeek = c. get (Calendar.DAY_OF_WEEK);
|
int lastdayofWeek = c.getActualMaximum(Calendar.DAY_OF_MONTH);
|
String colname[] = {
|
" 日 " , " 一 " , " 二 " , " 三 " , " 四 " , " 五 " , " 六 " };
|
int today = getNowCalendar(). get (Calendar.DAY_OF_MONTH);
|
// 设置固定字体,以免调用环境改变影响界面美观
|
dayPanel.setFont( new Font( " 宋体 " , Font.PLAIN, 12 ));
|
dayPanel.setLayout( new GridBagLayout());
|
dayPanel.setBackground(Color.white);
|
|
JLabel cell;
|
|
for ( int i = 0 ; i < 7 ; i ++ ) {
|
cell = new JLabel(colname[i]);
|
cell.setHorizontalAlignment(JLabel.CENTER);
|
cell.setPreferredSize( new Dimension( 25 , 25 ));
|
if (i == 0 || i == 6 ) {
|
cell.setForeground(weekendFontColor);
|
}
|
else {
|
cell.setForeground(weekFontColor);
|
}
|
dayPanel.add(cell, new GridBagConstraints(i, 0 , 1 , 1 , 0.0 , 0.0
|
, GridBagConstraints.CENTER,
|
GridBagConstraints.NONE,
|
new Insets( 0 , 0 , 0 , 0 ), 0 , 0 )
|
);
|
}
|
|
int actionCommandId = 1 ;
|
for ( int i = 0 ; i < 6 ; i ++ ) {
|
for ( int j = 0 ; j < 7 ; j ++ ) {
|
|
JButton numberButton = daysButton[i][j];
|
actionCommandId = Integer.parseInt(numberButton.
|
getActionCommand());
|
if (actionCommandId == today) {
|
numberButton.setBackground(todayBtnColor);
|
}
|
if ( (actionCommandId + firstdayofWeek - 2 ) % 7 == 6 ||
|
(actionCommandId + firstdayofWeek - 2 ) % 7 == 0 ) {
|
numberButton.setForeground(weekendFontColor);
|
}
|
else {
|
numberButton.setForeground(dateFontColor);
|
}
|
|
if (actionCommandId <= lastdayofWeek) {
|
int y = 0 ;
|
if ( (firstdayofWeek - 1 ) <=
|
(j + firstdayofWeek - 1 ) % 7 ) {
|
y = i + 1 ;
|
}
|
else {
|
y = i + 2 ;
|
}
|
dayPanel.add(numberButton,
|
new GridBagConstraints( (j +
|
firstdayofWeek -
|
1 ) %
|
7 , y, 1 , 1 , 0.0 , 0.0
|
, GridBagConstraints.CENTER,
|
GridBagConstraints.NONE,
|
new Insets( 0 , 0 , 0 , 0 ), 0 , 0 )
|
);
|
}
|
}
|
}
|
}
|
|
private int getSelectedYear() {
|
return ( (Integer) yearSpin.getValue()).intValue();
|
}
|
|
private int getSelectedMonth() {
|
return ( (Integer) monthSpin.getValue()).intValue();
|
}
|
|
|
|
/* *
|
* 年月小时的事件处理
|
* @param e ChangeEvent
|
*/
|
public void stateChanged(ChangeEvent e) {
|
JSpinner source = (JSpinner) e.getSource();
|
if (source.getName().equals( " Year " )) {
|
|
calendar. set (Calendar.YEAR, getSelectedYear());
|
dayPanel.removeAll();
|
this .flushWeekAndDayPanal(calendar);
|
dayPanel.revalidate();
|
dayPanel.updateUI();
|
return ;
|
}
|
if (source.getName().equals( " Month " )) {
|
calendar. set (Calendar.MONTH, getSelectedMonth() - 1 );
|
|
dayPanel.removeAll();
|
this .flushWeekAndDayPanal(calendar);
|
dayPanel.revalidate();
|
dayPanel.updateUI();
|
return ;
|
}
|
}
|
|
/* *
|
* 日期按钮的鼠标事件处理
|
*/
|
public void mouseClicked(MouseEvent e) {
|
jTextFieldDate.setColumns(10);
|
jTextFieldDate.setEnabled(true);
|
jTextFieldDate.setEditable(true);
|
if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 1 ) {
|
JButton source = (JButton) e.getSource();
|
|
String value = source.getText();
|
int day = Integer.parseInt(value);
|
calendar. set (Calendar.DAY_OF_MONTH, day);
|
Date selectDate = this .getSelectDate();
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
|
pattern);
|
DateChooser. this .setText(simpleDateFormat.format(selectDate));
|
|
int year = calendar. get (Calendar.YEAR);
|
int month = calendar. get (Calendar.MONTH) + 1 ;
|
// System.out.println(year + "年" + month + "月" + day + "日");
|
f.dispose();
|
}
|
}
|
|
public void mousePressed(MouseEvent e) {
|
// 空实现接口中的方法,不能删除
|
}
|
|
public void mouseReleased(MouseEvent e) {
|
// 空实现接口中的方法,不能删除
|
}
|
|
/* *
|
* 鼠标移动到日历中的事件
|
* @param e MouseEvent
|
*/
|
public void mouseEntered(MouseEvent e) {
|
JButton jbutton = (JButton) e.getSource();
|
jbutton.setBackground(moveButtonColor);
|
|
}
|
|
/* *
|
* 鼠标移出日历中的事件
|
* @param e MouseEvent
|
*/
|
public void mouseExited(MouseEvent e) {
|
JButton jbutton = (JButton) e.getSource();
|
int comm = Integer.parseInt(jbutton.getActionCommand());
|
int today = getNowCalendar(). get (Calendar.DAY_OF_MONTH);
|
if (comm == today) {
|
jbutton.setBackground(todayBtnColor);
|
}
|
else {
|
jbutton.setBackground(palletTableColor);
|
}
|
}
|
}
|
|
/* *
|
* 内部类,改变按钮的边框不可编辑区,使外观更加协调。
|
*/
|
class DateChooserButton
|
extends JButton {
|
public DateChooserButton(String text) {
|
super(text);
|
}
|
public Insets getInsets() {
|
return new Insets( 4 , 2 , 0 , 2 );
|
}
|
|
|
}
|
}
|