SWT 从线程中打开一个Shell的问题(在子线程中无法开启一个新的shell)

描述:我想制作一个不阻塞线程的弹出框,所以自定义了一个Dialog,继承Dialog并实现Runnable接口。


将display作为参数传入后,获得parent shell,并实例化child shell,以此shell创建dialog。


/**

     * Create the dialog.

     * @param parentShell

     */

    private ShowLoadingDialog(Shell parentShell) {

        super(parentShell);

        

    

        this.shell = parentShell;

        this.display = shell.getDisplay();

        label = new Label(shell, SWT.NONE);

    }

    

    public static ShowLoadingDialog getDialog(Display display){

        Shell shell = new Shell(display,SWT.TITLE | SWT.BORDER|SWT.APPLICATION_MODAL);

        return new ShowLoadingDialog(shell);

    }

定义一个open方法,当调用此方法时,会执行自身这个Runnable对象,我把shell的open放在了线程中启动,当收到关闭shell的通知时(isShow),结束线程



@Override

    public void run() {

        // TODO Auto-generated method stub        

        

            if(this.show){

                display.syncExec(new Runnable() {

                    

                    @Override

                    public void run() {

                        // TODO Auto-generated method stub

                        shell.open();

                        shell.layout();

                        while  ( ! shell.isDisposed() && isShow) {  

                                if  ( ! display.readAndDispatch()) ; 

                                display.sleep();  

                         }  

                    }

                });

            }

    }

Q1: 为什么无论我使用syscExec方法还是asyscExec方法,都无法显示出dialog

Q2:为什么将shell的open方法调用从run中移出来调用时,能显示出dilog但是程序会失去响应

(dialog的样式和坐标我已经在别的方法中设置好了,无需考虑着一点)


守候你守候我
浏览 810回答 1
1回答

神不在的星期二

我已经找到解决的办法了,忘了更新: 关于在使用Java的SWT开发UI时UI总是发生卡死的情况及解决办法
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java