更多精彩请到 http://www.139ya.com
http://hoodman.javaeye.com/blog/497262
一个SWT程序至少需要一个Display对象,创建Display的线程称为UI线程,一个线程中不能有两个Display。
第一次调用Display.getDefault()会创建一个Display,以后再次调用会返回创建的Display。
或者显式定义一个Display:Display dis=new Display(),以后调用getdefault()也会返回创建的Display。
多线程程序中,采用Display.getCurrent()可以获取当前线程的Display,调用 Display.findDisplay(Thread)可以找到任意线程的Display。
在多线程中不要使用getDefault(),容易导致非法线程访问异常。
Shell代表一个窗口,可以基于Display创建Shell,或者基于父Shell创建子shell,若父shell被关闭,子Shell也自动关闭。
使用Display.getMonitors()可以获取与Display相关的所有监视器,getPrimaryMonitor()可以获取主监视器,监视器(Monitor)的边界代表屏幕大小,客户区通常小于监视器尺寸.Monitor.getBounds();monitor.getClientArea(),用于获取边界和客户区。
多线程同步:Display维护一个自定义的事件队列,供后台线程与UI线程同步,后台线程利用Runalble对象插入事件队列,display执行消息循环时就会执行这些操作,Display提供了两个方法向队列中插入事件:
Display.syncExec(),Display.asyncExec()。前者同步调用,通知UI在下一个事件循环时执行Runalble的 run方法,同时线程将被阻塞,直到runable执行完毕,后者为异步调用,区别是线程不会被阻塞,runable执行完毕后不会得到通知。
public static void main(String[] args) {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Hello world!");
final Button button = new Button(shell, SWT.NONE);
button.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Thread thread = new Thread() {
@Override
public void run() {
try {
Thread.sleep(10000);//代表大量运算
} catch (Exception e2) {
// TODO: handle exception
}
display.syncExec(new Runnable() {
@Override
public void run() {
button.setText("finish");//运算完毕,提示通知
}
});
}
};
thread.start();
}
});
button.setText("button");
button.setBounds(20, 15, 155, 25);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
Monday, April 19, 2010
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment