Display.getDefault()。asyncExec给出了InvocationTargetException

时间:2016-08-08 05:36:44

标签: java swt invocationtargetexception

即使将所有SWT代码包装在" Display.getDefault().asyncExec"中,我也无法更新我的用户界面。

假设我有一个叫做单击一个按钮的监听器。

Listener enterlisner = new Listener() {
     @Override
        public void handleEvent(Event event) 
        {
             Display.getDefault().asyncExec(new Runnable() 
             {
                 public void run() 
                 {
                    try 
                    {
                        if((event.keyCode == SWT.CR || event.keyCode == 13 || event.type == SWT.Selection) && btnAdd.isEnabled())
                        {
                            new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress() 
                            {
                                @Override
                                public void run(final IProgressMonitor monitor) throws InvocationTargetException,
                                        InterruptedException 
                                {

                                            // method1()

                                            // method2() {method2.1() , method2.2()}

                                            // method3() {method3.1() , method3.2()}

                                            // ....

                                            // ...

                                            // method10

                                }
                            });
                        }   
                    } 
                    catch (InvocationTargetException | InterruptedException e) 
                    {
                        e.printStackTrace();
                    }
                }
            });
        }
};

有人可以参考思考link并让我知道我错在哪里吗?

如何分割在后台线程中运行的一些方法?

1 个答案:

答案 0 :(得分:2)

当您已经在UI线程中时,将整个代码包装在asyncExec中基本上没有任何效果(除了一些非常专业的用途)。

您必须查看代码并识别在后台线程中运行的每个部分。对这些位置的UI操作的任何访问都必须在此时使用asyncExec(或syncExec)调用。

传递给IRunnableWithProgress的{​​{1}}在后​​台线程中运行。因此,每次访问ProgressMonitorDialog代码中的任何UI对象时,您都必须使用单独的IRunnableWithProgressasyncExec来电。

类似于:

syncExec