实现像网页上的那种用户单击一个Text框然后框下面出现一个日历控件,点击Text框以外的地方日历消失,怎么实现?
- import org.eclipse.swt.SWT;
- import org.eclipse.swt.events.MouseAdapter;
- import org.eclipse.swt.events.MouseEvent;
- import org.eclipse.swt.graphics.Color;
- import org.eclipse.swt.graphics.Point;
- import org.eclipse.swt.widgets.Display;
- import org.eclipse.swt.widgets.Shell;
- import org.eclipse.swt.widgets.Text;
- public class DateTimeDemo extends Shell
- {
- private static Display display;
- private Text text;
- public static void main(String args[])
- {
- try
- {
- display = Display.getDefault();
- DateTimeDemo shell = new DateTimeDemo(display, SWT.SHELL_TRIM);
- shell.open();
- shell.layout();
- while (!shell.isDisposed())
- {
- if (!display.readAndDispatch())
- {
- display.sleep();
- }
- }
- display.dispose();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- public DateTimeDemo(Display display, int style)
- {
- super (display, style);
- createContents();
- }
- protected void createContents()
- {
- setText("DateTime" );
- setSize(471 , 140 );
- text = new Text( this , SWT.BORDER);
- text.setEditable(false );
- text.setBackground(new Color(display, 255 , 255 , 255 ));
- text.setBounds(122 , 41 , 228 , 25 );
- text.addMouseListener(new MouseAdapter()
- {
- public void mouseUp(MouseEvent e)
- {
- DTDialog dialog = DTDialog.getInstance(DateTimeDemo.this );
- dialog.open();
- }
- });
- }
- public Point getDtLocation()
- {
- return new Point(text.getLocation().x + DateTimeDemo. this .getLocation().x,
- text.getLocation().y + DateTimeDemo.this .getLocation().y + 60 );
- }
- public void setDate(String str)
- {
- text.setText(str);
- }
- @Override
- protected void checkSubclass()
- {
- // Disable the check that prevents subclassing of SWT components
- }
- }
- import org.eclipse.swt.SWT;
- import org.eclipse.swt.events.FocusAdapter;
- import org.eclipse.swt.events.FocusEvent;
- import org.eclipse.swt.events.SelectionAdapter;
- import org.eclipse.swt.events.SelectionEvent;
- import org.eclipse.swt.layout.FillLayout;
- import org.eclipse.swt.widgets.DateTime;
- import org.eclipse.swt.widgets.Dialog;
- import org.eclipse.swt.widgets.Display;
- import org.eclipse.swt.widgets.Shell;
- public class DTDialog extends Dialog
- {
- private Object result;
- private Shell shell;
- private DateTime dateTime;
- private DateTimeDemo parent;
- private static DTDialog instance;
- public static DTDialog getInstance(DateTimeDemo parent)
- {
- if (instance == null )
- {
- instance = new DTDialog(parent);
- }
- return instance;
- }
- private DTDialog(DateTimeDemo parent)
- {
- super (parent, SWT.NO_TRIM);
- this .parent = parent;
- }
- public Object open()
- {
- if (shell == null || shell.isDisposed())
- {
- createContents();
- shell.open();
- shell.layout();
- Display display = getParent().getDisplay();
- while (!shell.isDisposed())
- {
- if (!display.readAndDispatch())
- {
- display.sleep();
- }
- }
- display.dispose();
- }
- else
- {
- shell.setLocation(parent.getDtLocation());
- shell.setVisible(true );
- shell.setFocus();
- }
- return result;
- }
- protected void createContents()
- {
- shell = new Shell(getParent(), SWT.NO_TRIM);
- shell.setLayout(new FillLayout());
- shell.setSize(272 , 140 );
- shell.setLocation(parent.getDtLocation());
- shell.setText("SWT Dialog" );
- dateTime = new DateTime(shell, SWT.CALENDAR);
- dateTime.addSelectionListener(new SelectionAdapter()
- {
- public void widgetSelected(SelectionEvent e)
- {
- parent.setDate(formatDt());
- }
- });
- dateTime.addFocusListener(new FocusAdapter()
- {
- public void focusLost(FocusEvent e)
- {
- parent.setDate(formatDt());
- shell.setVisible(false );
- }
- });
- }
- private String formatDt()
- {
- return dateTime.getYear() + "-" + dateTime.getMonth() + "-" + dateTime.getDay();
- }
- public Shell getShell()
- {
- return shell;
- }
- }