Java日期选择控件

一次项目研发中需要日期时间选择控件,网上提供的不多,且质量一般,所以只好自己做,参考了 网上某位同学的 作品 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()); } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值