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