SWT中的日期选择控件

类似于Java Swing 中的JDateChooser,SWT里有没有相类似的日期选择控件呢?

目前有几种方式提供SWT的时间控件:

1.eclipse 3.3自带的org.eclipse.swt.widgets.DateTime控件.
   eclipse 3.3版本增加了对日期选择控件的支持,下面是官方提供的示例代码:

import  org.eclipse.swt. * ;
import  org.eclipse.swt.events. * ;
import  org.eclipse.swt.layout. * ;
import  org.eclipse.swt.widgets. * ;

public   class  Snippet251  {

    
public   static   void  main(String[] args)  {
        Display display 
=   new  Display();
        
final  Shell shell  =   new  Shell(display);
        shell.setLayout(
new  FillLayout());

        Button open 
=   new  Button(shell, SWT.PUSH);
        open.setText(
" Open Dialog " );
        open.addSelectionListener(
new  SelectionAdapter()  {
            
public   void  widgetSelected(SelectionEvent e)  {
                
final  Shell dialog  =   new  Shell(shell, SWT.DIALOG_TRIM);
                dialog.setLayout(
new  GridLayout( 3 false ));

                
final  DateTime calendar  =   new  DateTime(dialog, SWT.CALENDAR
                        
|  SWT.BORDER);
                
final  DateTime date  =   new  DateTime(dialog, SWT.DATE  |  SWT.SHORT);
                
final  DateTime time  =   new  DateTime(dialog, SWT.TIME  |  SWT.SHORT);

                
new  Label(dialog, SWT.NONE);
                
new  Label(dialog, SWT.NONE);
                Button ok 
=   new  Button(dialog, SWT.PUSH);
                ok.setText(
" OK " );
                ok.setLayoutData(
new  GridData(SWT.FILL, SWT.CENTER,  false ,
                        
false ));
                ok.addSelectionListener(
new  SelectionAdapter()  {
                    
public   void  widgetSelected(SelectionEvent e)  {
                        System.out
                                .println(
" Calendar date selected (MM/DD/YYYY) =  "
                                        
+  (calendar.getMonth()  +   1 )
                                        
+   " / "
                                        
+  calendar.getDay()
                                        
+   " / "
                                        
+  calendar.getYear());
                        System.out.println(
" Date selected (MM/YYYY) =  "
                                
+  (date.getMonth()  +   1 +   " / "   +  date.getYear());
                        System.out.println(
" Time selected (HH:MM) =  "
                                
+  time.getHours()  +   " : "   +  time.getMinutes());
                        dialog.close();
                    }

                }
);
                dialog.setDefaultButton(ok);
                dialog.pack();
                dialog.open();
            }

        }
);
        shell.pack();
        shell.open();

        
while  ( ! shell.isDisposed())  {
            
if  ( ! display.readAndDispatch())
                display.sleep();
        }

        display.dispose();
    }

}

2.第三方提供的免费日期选择控件,例如DatePicker, 它是一个下拉列表框, 提供了日期选择的功能.它在sourceforge上的主页是 http://sourceforge.net/projects/swt-datepicker/

3.也可以自己实现日期选择控件,下面是一个实现的例子:
import  java.text.SimpleDateFormat;
import  java.util.Calendar;
import  java.util.Date;

import  org.eclipse.swt.SWT;
import  org.eclipse.swt.custom.CLabel;
import  org.eclipse.swt.events.MouseEvent;
import  org.eclipse.swt.events.MouseListener;
import  org.eclipse.swt.events.SelectionAdapter;
import  org.eclipse.swt.events.SelectionEvent;
import  org.eclipse.swt.graphics.Color;
import  org.eclipse.swt.layout.GridData;
import  org.eclipse.swt.layout.GridLayout;
import  org.eclipse.swt.widgets.Button;
import  org.eclipse.swt.widgets.Dialog;
import  org.eclipse.swt.widgets.Display;
import  org.eclipse.swt.widgets.Shell;

public   class  CalendarDialog  extends  Dialog  implements  MouseListener  {

    
private Display display = null;

    
private Date nowDate = null// current date

    
private String selectedDate = ""// selected date

    
private Shell shell = null;

    
private GridLayout gridLayout = null;

    
private GridData gridData = null;

    
private CLabel sunday = null;

    
private CLabel monday = null;

    
private CLabel tuesday = null;

    
private CLabel wednesday = null;

    
private CLabel thursday = null;

    
private CLabel friday = null;

    
private CLabel saturday = null;

    
private Button yearUp = null;

    
private Button yearNext = null;

    
private Button monthUp = null;

    
private Button monthNext = null;

    
private CLabel nowLabel = null;

    
private CLabel[] days = new CLabel[42];

    
private boolean hasChanged = false;

    
public CalendarDialog(Shell parent, int style) {
        
super(parent, style);
    }


    
public CalendarDialog(Shell parent) {
        
this(parent, 0);
    }


    
private int getLastDayOfMonth(int year, int month) {
        
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
                
|| month == 10 || month == 12{
            
return 31;
        }

        
if (month == 4 || month == 6 || month == 9 || month == 11{
            
return 30;
        }

        
if (month == 2{
            
if (isLeapYear(year)) {
                
return 29;
            }
 else {
                
return 28;
            }

        }

        
return 0;
    }


    
public boolean isLeapYear(int year) {
        
return (year % 4 == 0 && year % 100 != 0|| (year % 400 == 0);
    }


    
private void moveTo(int type, int value) {
        Calendar now 
= Calendar.getInstance(); // get current Calendar object
        now.setTime(nowDate); // set current date
        now.add(type, value); // add to spec time.
        nowDate = new Date(now.getTimeInMillis()); // result
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");// format
        
// date
        nowLabel.setText(formatter.format(nowDate)); // set to label
        setDayForDisplay(now);
    }


    
private void setDayForDisplay(Calendar now) {
        
int currentDay = now.get(Calendar.DATE);
        now.add(Calendar.DAY_OF_MONTH, 
-(now.get(Calendar.DATE) - 1)); //
        int startIndex = now.get(Calendar.DAY_OF_WEEK) - 1//
        int year = now.get(Calendar.YEAR); //
        int month = now.get(Calendar.MONTH) + 1//
        int lastDay = this.getLastDayOfMonth(year, month); //
        int endIndex = startIndex + lastDay - 1//
        int startday = 1;
        
for (int i = 0; i < 42; i++{
            Color temp 
= days[i].getBackground();
            
if (temp.equals(display.getSystemColor(SWT.COLOR_BLUE))) {
                days[i].setBackground(display.getSystemColor(SWT.COLOR_WHITE));
            }

        }

        
for (int i = 0; i < 42; i++{
            
if (i >= startIndex && i <= endIndex) {
                days[i].setText(
"" + startday);
                
if (startday == currentDay) {
                    days[i].setBackground(display
                            .getSystemColor(SWT.COLOR_BLUE)); 
//
                }

                startday
++;
            }
 else {
                days[i].setText(
"");
            }

        }


    }


    
public void previousYear() {
        moveTo(Calendar.YEAR, 
-1);
    }


    
public void nextYear() {
        moveTo(Calendar.YEAR, 
1);
    }


    
public void nextMonth() {
        moveTo(Calendar.MONTH, 
1);
    }


    
public void previousMonth() {
        moveTo(Calendar.MONTH, 
-1);
    }


    
public void mouseDoubleClick(MouseEvent e) {
    }


    
public void mouseDown(MouseEvent e) {

        CLabel day 
= (CLabel) e.getSource();

        
if (!day.getText().equals("")) {
            
this.selectedDate = nowLabel.getText() + "-" + day.getText();
            
this.shell.close();
        }

        hasChanged 
= true;
    }


    
public void mouseUp(MouseEvent e) {
    }


    
public void open(int x, int y) {

        Shell parent 
= getParent();
        display 
= Display.getDefault();
        shell 
= new Shell(parent);
        shell.setBounds(x, y, 
230220);

        hasChanged 
= false;

        gridLayout 
= new GridLayout();
        gridLayout.numColumns 
= 7;
        shell.setLayout(gridLayout);

        gridData 
= new GridData(GridData.FILL_HORIZONTAL);
        yearUp 
= new Button(shell, SWT.PUSH | SWT.FLAT);
        yearUp.setText(
"<");
        yearUp.setLayoutData(gridData);
        yearUp.addSelectionListener(
new SelectionAdapter() {
            
public void widgetSelected(SelectionEvent e) {
                previousYear();
            }

        }
);

        gridData 
= new GridData(GridData.FILL_HORIZONTAL);
        monthUp 
= new Button(shell, SWT.PUSH | SWT.FLAT);
        monthUp.setText(
"<<");
        monthUp.setLayoutData(gridData);
        monthUp.addSelectionListener(
new SelectionAdapter() {
            
public void widgetSelected(SelectionEvent e) {
                previousMonth();
            }

        }
);

        nowLabel 
= new CLabel(shell, SWT.CENTER | SWT.SHADOW_OUT);
        gridData 
= new GridData(GridData.FILL_HORIZONTAL);
        gridData.horizontalSpan 
= 3;
        nowLabel.setLayoutData(gridData);
        SimpleDateFormat formatter 
= new SimpleDateFormat("yyyy-MM");
        nowLabel.setText(formatter.format(
new Date()));

        gridData 
= new GridData(GridData.FILL_HORIZONTAL);
        monthNext 
= new Button(shell, SWT.PUSH | SWT.FLAT);
        monthNext.setText(
">>");
        monthNext.setLayoutData(gridData);
        monthNext.addSelectionListener(
new SelectionAdapter() {
            
public void widgetSelected(SelectionEvent e) {
                nextMonth();
            }

        }
);

        gridData 
= new GridData(GridData.FILL_HORIZONTAL);
        yearNext 
= new Button(shell, SWT.PUSH | SWT.FLAT);
        yearNext.setText(
">");
        yearNext.setLayoutData(gridData);
        yearNext.addSelectionListener(
new SelectionAdapter() {
            
public void widgetSelected(SelectionEvent e) {
                nextYear();
            }

        }
);

        sunday 
= new CLabel(shell, SWT.CENTER | SWT.SHADOW_OUT);
        gridData 
= new GridData(GridData.FILL_HORIZONTAL
                
| GridData.FILL_VERTICAL);
        gridData.widthHint 
= 20;
        gridData.heightHint 
= 20;
        sunday.setLayoutData(gridData);
        sunday.setText(
"Sun");

        monday 
= new CLabel(shell, SWT.CENTER | SWT.SHADOW_OUT);
        gridData 
= new GridData(GridData.FILL_HORIZONTAL
                
| GridData.FILL_VERTICAL);
        gridData.widthHint 
= 20;
        gridData.heightHint 
= 20;
        monday.setLayoutData(gridData);
        monday.setText(
"Mon");

        tuesday 
= new CLabel(shell, SWT.CENTER | SWT.SHADOW_OUT);
        gridData 
= new GridData(GridData.FILL_HORIZONTAL
                
| GridData.FILL_VERTICAL);
        gridData.widthHint 
= 20;
        gridData.heightHint 
= 20;
        tuesday.setLayoutData(gridData);
        tuesday.setText(
"Tue");

        wednesday 
= new CLabel(shell, SWT.CENTER | SWT.SHADOW_OUT);
        gridData 
= new GridData(GridData.FILL_HORIZONTAL
                
| GridData.FILL_VERTICAL);
        gridData.widthHint 
= 20;
        gridData.heightHint 
= 20;
        wednesday.setLayoutData(gridData);
        wednesday.setText(
"Wed");

        thursday 
= new CLabel(shell, SWT.CENTER | SWT.SHADOW_OUT);
        gridData 
= new GridData(GridData.FILL_HORIZONTAL
                
| GridData.FILL_VERTICAL);
        gridData.widthHint 
= 20;
        gridData.heightHint 
= 20;
        thursday.setLayoutData(gridData);
        thursday.setText(
"Thu");

        friday 
= new CLabel(shell, SWT.CENTER | SWT.SHADOW_OUT);
        gridData 
= new GridData(GridData.FILL_HORIZONTAL
                
| GridData.FILL_VERTICAL);
        gridData.widthHint 
= 20;
        gridData.heightHint 
= 20;
        friday.setLayoutData(gridData);
        friday.setText(
"Fri");

        saturday 
= new CLabel(shell, SWT.CENTER | SWT.SHADOW_OUT);
        gridData 
= new GridData(GridData.FILL_HORIZONTAL
                
| GridData.FILL_VERTICAL);
        gridData.widthHint 
= 20;
        gridData.heightHint 
= 20;
        saturday.setLayoutData(gridData);
        saturday.setText(
"Sat");

        
for (int i = 0; i < 42; i++{
            days[i] 
= new CLabel(shell, SWT.FLAT | SWT.CENTER);
            gridData 
= new GridData(GridData.FILL_HORIZONTAL
                    
| GridData.FILL_VERTICAL);
            days[i].setLayoutData(gridData);
            days[i].setBackground(display.getSystemColor(SWT.COLOR_WHITE));
            days[i].addMouseListener(
this);
        }


        Calendar now 
= Calendar.getInstance(); //
        nowDate = new Date(now.getTimeInMillis());
        setDayForDisplay(now);

        shell.open();
        Display display 
= parent.getDisplay();
        
while (!shell.isDisposed()) {
            
if (!display.readAndDispatch()) {
                display.sleep();
            }

        }

    }


    
public boolean isChanged() {
        
return hasChanged;
    }


    
public String getDateText() {
        
return selectedDate.toString();
    }


}

你可能感兴趣的:(SWT中的日期选择控件)