Display与Shell

一个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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值