代码之家  ›  专栏  ›  技术社区  ›  marc esher

如何从作业内部更新JFace查看器?

  •  0
  • marc esher  · 技术社区  · 14 年前

    问题是:

    我有一个带有JFace树查看器和表的视图(不是表查看器。。。这一点将在今后有所改变)。

    我有一个用视图引用初始化的操作(这对我来说很糟糕,但我还不知道如何正确地进行)。当操作通过视图上的按钮运行时,操作: 2) 获取基础模型 3) 创建作业 b) 使用视图中公开的函数“清除”视图中的表 4) 添加实现“done()”的JobChangeListener。 a) 在done()方法中,它通过以下代码扩展treeviewer:

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

    在作业内部,每当我尝试访问查看器中的元素时,就会出现无效的线程访问错误。我相信我理解为什么在作业内部运行时得到它们,但是如果不能与作业更改侦听器中的小部件交互,我不确定如何正确地处理它们。如果我将每个与小部件的交互都包装在getDisplay().synchExec(…)中,我就可以让它工作,但我似乎记得读到这篇文章时说这并不可取。

    我觉得我对eclipseswt的理解有了很大的飞跃,所以我非常感谢您的指导。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Lii bob    7 年前

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

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

    Display.syncExec ,您要确保它在显示线程(UI线程)中运行。