从正在运行的 eclipse 实例中按 id 获取视图



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

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
                             .
                             .
    }
}

插件.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>

我使用"以 Eclipse 应用程序运行"来运行该项目,它会打开一个新的 Eclipse 实例(只是称之为 Inner Eclipse)并显示我的视图。

我在我的项目中(从我运行项目的地方,即不是内部日食)另一个类 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 类中,我需要做一些分析,然后更新视图的小部件,然后需要反映在 Inner Eclipse 中。任何帮助将不胜感激

无效的线程访问"表示您在非 UI 线程中运行 UI 代码。

只有一个 UI 线程

,您可以使用以下命令安排在 UI 线程中运行代码:

Display.getDefault().asyncExec(runnable);

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

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

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

在 UI 线程中运行的代码不应执行任何长时间运行的操作,因为这会阻止 UI。

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

最新更新