我为我的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 代码。