display.syncExec方法例子

时间:2021-03-20 18:34:14
一个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执行完毕后不会得到通知。


[java]  view plain  copy
  1. public static void main(String[] args) {  
  2.         final Display display = new Display();  
  3.         Shell shell = new Shell(display);  
  4.         shell.setText("Hello world!");  
  5.         final Button button = new Button(shell, SWT.NONE);  
  6.         button.addSelectionListener(new SelectionAdapter() {  
  7.             @Override  
  8.             public void widgetSelected(SelectionEvent e) {  
  9.                 Thread thread = new Thread() {  
  10.                     @Override  
  11.                     public void run() {  
  12.                         try {  
  13.                             Thread.sleep(10000);//代表大量运算  
  14.                         } catch (Exception e2) {  
  15.                             // TODO: handle exception  
  16.                         }  
  17.                         display.syncExec(new Runnable() {  
  18.                             @Override  
  19.                             public void run() {  
  20.                                 button.setText("finish");//运算完毕,提示通知  
  21.                             }  
  22.                         });  
  23.                     }  
  24.                 };  
  25.                 thread.start();  
  26.             }  
  27.         });  
  28.         button.setText("button");  
  29.         button.setBounds(201515525);  
  30.   
  31.         shell.open();  
  32.         while (!shell.isDisposed()) {  
  33.             if (!display.readAndDispatch())  
  34.                 display.sleep();  
  35.         }  
  36.         display.dispose();  
  37.     }