日期时间选择控件

 
一次项目研发中需要日期时间选择控件,
网上提供的不多,
且质量一般,
所以只好自己做,参考了 网上某位同学的 作品 Jave 日期选择控件 DateChooser

目前的代码将日期时间选择封装在一个按钮组件内,
应该很好用,支持 Application Applet



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 ="" ;


public DateChooserJButton() {
this(getNowDate()) ;
}


public DateChooserJButton(SimpleDateFormat df , String dateString) {
this() ;
setText(df,dateString) ;
}


public DateChooserJButton(Date date) {
this("",date);
}

public DateChooserJButton(String preLabel , Date date) {
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());
}

}



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值