从 运行 eclipse 实例中通过 id 获取视图

Getting a view by id from a running eclipse instance

我为我的 Eclipse 插件的自定义视图创建了以下 StatisticsView Class:

public  class StatisticsView extends ViewPart {
    public StyledText projectname;
    public void createPartControl(Composite parent) {
            GridLayout layout = new GridLayout(3, false);
        parent.setLayout(layout);
        //Project Name
        Label projectnameLabel = new Label(parent, SWT.NONE);
        projectnameLabel.setText("Project name: ");
        projectname = new StyledText(parent, SWT.NONE);
        projectname.setText("Anything for now");
                               .
                               .
    }
                               .
                               .
    public String getProjectName() {
        return projectname.getText();
    }

    public void updateData(Stats statistics) {
              projectname.setText(statistics.getProjectName());     //causes the error
                             .
                             .
    }
}

plugin.xml 文件具有以下观点:

<extension
         point="org.eclipse.ui.views">
      <category
            name="XYZ"
            id="XYZ">
      </category>
      <view
            name="Statistics"
            inject="true"
            category="XYZ"
            class="XYZ.view.StatisticsView"
            id="XYZ.view.StatisticsView">
      </view>
   </extension>

我 运行 使用 "Run as Eclipse Application" 项目,它会打开一个新的 Eclipse 实例(只是调用它,Inner Eclipse ) 以及显示我的视图的位置。

我在我的项目中(我从那里 运行 项目,即不是内部 Eclipse)另一个 class ResultsListener 我试图在其中找到这个视图使用它的 "id" 像这样:

                .....
IWorkbenchWindow workbenchWindow = null;
IWorkbenchWindow[] allWindows = PlatformUI.getWorkbench().getWorkbenchWindows();
for (IWorkbenchWindow window : allWindows) {
      workbenchWindow = window;
      if (workbenchWindow != null) {
             System.out.println("Found workbench");
             break;
      }
}
IWorkbenchPage activePage = workbenchWindow.getActivePage();
IViewPart viewPart = activePage.findView("XYZ.view.StatisticsView");
if(viewPart==null) {
      System.out.println("View Not found");
}
StatisticsView myView = (StatisticsView)viewPart;
System.out.println(myView.getProjectName());      //causes the error
myView.updateData(stat);

每当我调用找到的视图的任何方法时,它都会给我以下错误: org.eclipse.swt.SWTException: Invalid thread access

在我的 ResultsListener class 中,我需要进行一些分析,然后更新视图的小部件,然后需要将其反映到 Inner Eclipse 中。 任何帮助将不胜感激

无效的线程访问'意味着您在非UI线程中运行宁UI代码。

只有一个 UI 线程,您可以在 UI 线程中安排 运行 代码使用:

Display.getDefault().asyncExec(runnable);

其中 runnable 是实现 Runnable 的东西。这可能只是一个 lambda:

Display.getDefault().asyncExec(() -> { ... code block ... });

asyncExec 运行 异步代码。也可以用syncExec同步到运行代码(当前线程会阻塞,直到UI代码有运行)。

UI 线程中的代码 运行ning 不应执行任何长 运行ning 操作,因为这会阻塞 UI.

注意:理想情况下,您应该有一个单独的非 UI 'model' class 包含您的数据。视图可以获取和设置模型中的值,然后分析代码也可以访问模型中的结果,而无需执行任何 UI 代码。