如何在asyncExec()调用中更新SWT GUI

时间:2015-01-01 21:38:27

标签: java asynchronous swt

在我的SWT GUI中,我希望有一个启动作业的按钮,在运行该作业时,更新一个文本框,该文本框将显示该作业事件的日志。但是,在我的asyncExec()调用结束之前,我的文本框不会更新。在下面的示例中,我希望我的文本框每秒更新一次,但它会在完成执行后的10整秒后立即获得所有更新。

有没有办法实现这个目标?

private void UpdateUI()
{
    Display.getDefault().asyncExec(new Runnable() {
          @Override
          public void run() 
          {
            StringBuilder sb = new StringBuilder();
            for(int i=1; i<=10; i++)
            {
                sb.append("Running iteration " + i + "\n");
                txtLogBox.setText(sb.toString());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
          }});
}

1 个答案:

答案 0 :(得分:2)

你在UI线程中睡觉了。您需要在不同的线程中执行长时间运行的工作,并且只使用asyncExec将更新发布到UI线程。例如:

new Thread(new Runnable() {
    public void run()
    {
        StringBuilder sb = new StringBuilder();

        for(int i=1; i<=10; i++)
        {
            sb.append("Running iteration " + i + "\n");
            final String result = sb.toString();

            Display.getDisplay().asyncExec(new Runnable() {
                public void run()
                {
                    txtLogBox.setText(result);
                }
            });

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}).start();