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, 230, 220);

        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();
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值