Java日期选择控件

来源:互联网 发布:template.js教程 编辑:程序博客网 时间:2024/06/05 05:33

一次项目研发中需要日期时间选择控件,网上提供的不多,且质量一般,所以只好自己做,参考了 网上某位同学的 作品 Jave日期选择控件 DateChooser 。 目前的代码将日期时间选择封装在一个按钮组件内,应该很好用,支持Application、Applet

 import java.util.Date; importjava.util.Calendar; import java.text.DateFormat; importjava.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 ; importjava.awt.FlowLayout ; import java.awt.GridLayout ; importjava.awt.Component ; import java.awt.Cursor ; import java.awt.Frame; import java.awt.event.ActionEvent; importjava.awt.event.ActionListener; import java.awt.event.MouseListener;import java.awt.event.MouseAdapter; importjava.awt.event.MouseEvent; //import javax.swing.JFrame; importjavax.swing.JButton; import javax.swing.JDialog; importjavax.swing.JPanel; import javax.swing.JLabel; importjavax.swing.JSpinner ; import javax.swing.JSpinner.NumberEditor ;import javax.swing.SpinnerNumberModel; importjavax.swing.SwingUtilities; import javax.swing.SwingConstants ;import javax.swing.event.ChangeListener ; importjavax.swing.event.ChangeEvent ; importjavax.swing.border.LineBorder ; public class DateChooserJButtonextends JButton { private DateChooser dateChooser =null; privateString preLabel ="" ; public DateChooserJButton() {this(getNowDate()) ; } public DateChooserJButton(SimpleDateFormatdf , String dateString) { this() ; setText(df,dateString) ; }public DateChooserJButton(Date date) { this("",date); } publicDateChooserJButton(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 voidactionPerformed(ActionEvent e) { if (dateChooser==null) dateChooser= new DateChooser(); Point p = getLocationOnScreen() ; p.y = p.y+30; dateChooser.showDateChooser(p) ; } }) ; } private static DategetNowDate() { return Calendar.getInstance().getTime() ; } privatestatic SimpleDateFormat getDefaultDateFormat() { return newSimpleDateFormat("yyyy年MM月dd日HH时") ; } //覆盖父类的方法 public voidsetText(String s) { Date date ; try { date =getDefaultDateFormat().parse(s) ; }catch (ParseException e) { date= getNowDate() ; } setDate(date) ; } public voidsetText(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 { returngetDefaultDateFormat().parse(dateString); } catch (ParseExceptione) { return getNowDate() ; } } //覆盖父类的方法使之无效 public voidaddActionListener(ActionListener listener ) { } private classDateChooser 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; //周末文字色 //控制条配色------------------// ColorcontrolLineColor = Color.pink; //控制条底色 Color controlTextColor =Color.white; //控制条标签文字色 Color rbFontColor = Color.white;//RoundBox文字色 Color rbBorderColor = Color.red; //RoundBox边框色 ColorrbButtonColor = 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 JPanelcreateYearAndMonthPanal(){ Calendar c = getCalendar() ; intcurrentYear =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(newSpinnerNumberModel(currentYear,startYear,lastYear,1));yearSpin.setPreferredSize(new Dimension(48,20)) ;yearSpin.setName("Year") ; yearSpin.setEditor(newJSpinner.NumberEditor(yearSpin, "####")) ;yearSpin.addChangeListener(this) ; result.add(yearSpin) ; JLabelyearLabel = new JLabel("年");yearLabel.setForeground(controlTextColor); result.add(yearLabel);monthSpin = new JSpinner(newSpinnerNumberModel(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(newSpinnerNumberModel(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() { Stringcolname[] = {"日","一","二","三","四","五","六"}; JPanel result = newJPanel(); //设置固定字体,以免调用环境改变影响界面美观 result.setFont(new Font("宋体",Font.PLAIN, 12)); result.setLayout(new GridLayout(7,7));result.setBackground(Color.white); JLabel cell ; for(inti=0;i<7;i++) { cell = new JLabel(colname[i]);cell.setHorizontalAlignment(JLabel.RIGHT); if (i==0 || i==6)cell.setForeground(weekendFontColor) ; elsecell.setForeground(weekFontColor) ; result.add(cell) ; } intactionCommandId = 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) ; elsenumberButton.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(); } PointgetAppropriateLocation(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 intgetSelectedMonth() { return((Integer)monthSpin.getValue()).intValue() ; } private intgetSelectedHour() { return((Integer)hourSpin.getValue()).intValue() ; } private voiddayColorUpdate(boolean isOldDay) { Calendar c = getCalendar() ; intday = 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) ; elsedaysButton[i][j].setForeground(todayBackColor) ; } private voidflushWeekAndDay() { 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) ; intnewDay = Integer.parseInt(source.getText()); Calendar c =getCalendar() ; c.set(Calendar.DAY_OF_MONTH,newDay);setDate(c.getTime()); } } }

原创粉丝点击