display.syncExec方法例子

来源:互联网 发布:网络传真服务器 编辑:程序博客网 时间:2024/06/02 19:32
一个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();    }

0 0