JAVA GUI中日期选择控件的实现

这篇博客介绍了如何在Java GUI中使用SWT库来实现日期选择功能,特别是关注Eclipse 3.3版本引入的DateTime控件,并提供了官方示例代码。
摘要由CSDN通过智能技术生成
最近在做项目时在日期选择控件上花了不少时间,所以在此总结一下,引用的地方均注明了原文出处。
一、SWING版
运行效果图:

代码:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.border.
* ;
import javax.swing.
event . * ;
import javax.swing.
* ;
import java.awt.
* ;
import java.awt.
event . * ;
/* *
 * 日期的选择控件,可以作为普通的组件使用,在构造函数中,必须传入一个该组件的所有者对象。
 * 并且该对象只能是一个Frame对象或者一个JFrame对象。
 * 使用方法如下:
 *       JFrame frame2 = new JFrame();
 *       frame2.getContentPane().setLayout(null);
 *       DateChooser date = new DateChooser(frame2);
 *       frame2.getContentPane().add(date);
 *       frame2.setSize(500, 400);
 *       frame2.setVisible(true); 
 *组件的外观象一个combox,单击下拉按钮就可以对日期进行选择。
 * Title: 日期选择控件
 * Copyright: Copyright (c) 2006
 * Company: Xaccp
 * Date:2006年6月17日
 * @author Tellixu(许天岭)
 * @version 1.0
 
*/
public   class  DateChooser extends JPanel
{
    
        
private   int  width  =   200 // 日期控件的宽度
         private   int  height  =   220 // 日期控件的高度
    
        
private  GridBagLayout gridBagLayout1  =   new  GridBagLayout();
        
private  JTextField dateField  =   new  JTextField();
        
private  DateChooserButton btnChoose  =   new  DateChooserButton( " " );  // ▼是指:▼下拉箭头的unicode码
         private  String parten;
        
private  Container owner;
        
private   int  length = 120 ;
        
public  DateChooser(Container owner, int  length) {
           
this .owner  =  owner;
           
this .parten  =   " yyyy-MM-dd " ;
           
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 " ;
            
try  {
                init();
            }
            
catch  (Exception ex) {
                ex.printStackTrace();
            }
        }
    
        
/* *
         * 系统初始化
         * @throws Exception
         
*/
        
private   void  init() throws Exception {
            dateField.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(dateField,  new  GridBagConstraints( 0 0 1 1 0.0 0.0
                , GridBagConstraints.CENTER,
                GridBagConstraints.NONE,
                
new  Insets( 0 0 0 0 ),  this .length,  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) {
            dateField.setToolTipText(text);
            btnChoose.setToolTipText(text);
        }
        
/* *
         * 下拉按钮的事件处理
         * @param e ActionEvent
         
*/
        
public   void  btnChoose_actionPerformed(ActionEvent e) {
            java.awt.Rectangle r 
=  dateField.getBounds();
            Point pOnScreen 
=  dateField.getLocationOnScreen();
    
            Point result 
=   new  Point(pOnScreen.x, pOnScreen.y  +  r.height);
            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;
            }
    
            javax.swing.JDialog dateFrame 
=   new  javax.swing.JDialog();
            dateFrame.setModal(
false );
            dateFrame.setUndecorated(
true );
            dateFrame.setLocation(result);
            dateFrame.setSize(width, height);
    
            dateFrame.addWindowListener(
new  WindowAdapter() {
                
// 在任意的非日期选择区单击,则日期选择组件将变为非活动状态,自动释放资源。
                 public   void  windowDeactivated(WindowEvent e) {
                    javax.swing.JDialog f 
=  (javax.swing.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 .dateField.getText();
        }
        
/* *
         * 设置文本域的值
         * @param text String
         
*/
        
public   void  setText(String text) {
            
this .dateField.setText(text);
        }
        
/* *
         * 该方法非常有用,是外部直接访问的TextField对象。
         * @return JTextField
         
*/
        
public  JTextField getDateField() {
            
return  dateField;
        }
        
/* *
         * 内部类,日期选择控件的主体,封装了所有日期选择的内容,主要是一个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.BLUE;  // 鼠标移动的日历底色
            Color todayBtnColor  =  Color.pink;  // 今天的日历底色
    
// 控制条配色------------------ //
            Color controlLineColor  =  Color.pink;  // 控制条底色
            Color controlTextColor  =  Color.white;  // 控制条标签文字色
    
            JSpinner yearSpin;
            JSpinner monthSpin;
            JSpinner hourSpin;
            JButton[][] daysButton 
=   new  JButton[ 6 ][ 7 ];
    
            javax.swing.JDialog f;
    
            JPanel dayPanel 
=   new  JPanel();  // 日期panel
            JPanel yearPanel  =   new  JPanel();
    
            Calendar calendar 
=  Calendar.getInstance();
            String pattern;
    
            
/* *
             * 日期选择控件放在了非模态对话框中
             
*/
            
public  DatePanel(javax.swing.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.HOUR_OF_DAY);
                yearSpin 
=   new  JSpinner( new  javax.swing.SpinnerNumberModel(
                    currentYear,
                    startYear, lastYear, 
1 ));
                monthSpin 
=   new  JSpinner( new  javax.swing.SpinnerNumberModel(
                    currentMonth, 
1 12 ,
                    
1 ));
                hourSpin 
=   new  JSpinner( new  javax.swing.SpinnerNumberModel(
                    currentHour, 
0 23 ,
                    
1 ));
    
                yearPanel.setLayout(
new  java.awt.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);
    
                hourSpin.setPreferredSize(
new  Dimension( 35 20 ));
                hourSpin.setName(
" Hour " );
                hourSpin.addChangeListener(
this );
                yearPanel.add(hourSpin);
    
                JLabel hourLabel 
=   new  JLabel( " " );
                hourLabel.setForeground(controlTextColor);
                yearPanel.add(hourLabel);
            }
            
/* *
             * 根据日期刷新显示面板
             
*/
            
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  java.awt.Font( " 宋体 " , java.awt.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值