如何从作业内更新JFace Viewer?

时间:2010-05-04 01:20:49

标签: eclipse swt jface

警告:我仍然在Eclipse插件开发中遇到适当的MVC,所以如果你在这里看到任何可能导致我更痛苦的事情,请告诉我。

问题:

我有一个带有JFace树查看器和表的视图(不是表格查看器......将在路上更改)。

我有一个通过引用View初始化的动作(这对我来说似乎很糟糕,但我还不知道如何以正确的方式做到这一点)。当动作运行时 - 通过视图上的按钮 - 动作: 1)从视图中获取树查看器 2)获取底层模型 3)创造一份工作    a)在工作中,循环遍历模型并对其执行各种操作,包括在模型中添加其他子项    b)使用视图中公开的函数“清除”视图中的表 4)添加一个实现“done()”的JobChangeListener。   a)在done()方法内部,它通过以下代码扩展树形视图:

loadMethodsJob.addJobChangeListener(new JobChangeAdapter(){
        public void done(IJobChangeEvent event){
            view.enableActions();
            view.getTestsViewer().expandAll();
        }
    });

在Job中,每当我尝试访问查看器中的元素时,都会收到无效的线程访问错误。我相信我理解为什么我在工作中运行时会得到它们,但如果我无法与作业更改监听器中的小部件交互,我不确定如何正确解决它们。如果我在getDisplay()。synchExec(....)中包含与小部件的每次交互,我可以让它工作,但我似乎记得读到这不是更好。

我觉得自己正处于与Eclipse SWT理解的大跃进中,所以我很欣赏任何有关实现这一目标的指导。

1 个答案:

答案 0 :(得分:1)

SWT中的任何UI组件只能由UI线程访问。

由于作业的done方法在单独的非UI线程中运行,因此会触发无效的线程访问。

通过将每个交互包装在Display.syncExec中,您确保它在显示线程(UI线程)中运行。

上述方法应该没有任何问题。