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

View 从正在运行的eclipse实例中按id获取视图,view,eclipse-plugin,View,Eclipse Plugin,我为Eclipse插件的自定义视图创建了以下StatisticsView类: 公共类统计视图扩展了ViewPart{ 公共样式文本项目名称; 公共void createPartControl(复合父级){ GridLayout=新的GridLayout(3,false); 父.setLayout(布局); //项目名称 标签项目名称标签=新标签(父项,SWT.NONE); projectnamelab.setText(“项目名称:”); projectname=newstyledtext(父级,

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

公共类统计视图扩展了ViewPart{
公共样式文本项目名称;
公共void createPartControl(复合父级){
GridLayout=新的GridLayout(3,false);
父.setLayout(布局);
//项目名称
标签项目名称标签=新标签(父项,SWT.NONE);
projectnamelab.setText(“项目名称:”);
projectname=newstyledtext(父级,SWT.NONE);
projectname.setText(“暂时的任何东西”);
.
.
}
.
.
公共字符串getProjectName(){
返回projectname.getText();
}
公共void updateData(统计信息){
projectname.setText(statistics.getProjectName());//导致错误
.
.
}
}
plugin.xml文件具有以下视点:


我使用作为Eclipse应用程序运行该项目,该应用程序打开一个新的Eclipse实例(将其称为内部Eclipse),并显示我的视图

我在我的项目中(从我运行项目的地方,即不是内部Eclipse)有另一个类ResultsListener,在该类中,我尝试使用其“id”查找此视图,如下所示:

。。。。。
IWorkbenchWindow workbenchWindow=null;
IWorkbenchWindow[]allWindows=PlatformUI.getWorkbench().getWorkbenchWindow();
用于(iWorkbenchWindows窗口:所有窗口){
工作台窗口=窗口;
if(工作台窗口!=null){
System.out.println(“找到的工作台”);
打破
}
}
IWorkbenchPage activePage=workbenchWindow.getActivePage();
IViewPart viewPart=activePage.findView(“XYZ.view.StatisticsView”);
如果(viewPart==null){
System.out.println(“未找到视图”);
}
统计视图myView=(统计视图)视图部件;
System.out.println(myView.getProjectName())//导致错误的原因
myView.updateData(stat);
无论何时调用Find视图的任何方法,都会出现以下错误:
org.eclipse.swt.swt异常:线程访问无效

在ResultsListener类中,我需要进行一些分析,然后更新视图的小部件,这些小部件需要反映在内部Eclipse中。
任何帮助都将非常感谢

无效线程访问”意味着您正在非UI线程中运行UI代码

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

Display.getDefault().asyncExec(可运行);
其中
runnable
是实现
runnable
的东西。t这可能只是一只羔羊:

Display.getDefault().asyncExec(()->{…代码块…});
asyncExec
异步运行代码。您还可以使用
syncExec
同步运行代码(当前线程将阻塞,直到UI代码运行)

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


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

无效线程访问”表示您正在非UI线程中运行UI代码

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

Display.getDefault().asyncExec(可运行);
其中
runnable
是实现
runnable
的东西。t这可能只是一只羔羊:

Display.getDefault().asyncExec(()->{…代码块…});
asyncExec
异步运行代码。您还可以使用
syncExec
同步运行代码(当前线程将阻塞,直到UI代码运行)

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


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

“无效线程访问”表示您正在非UI线程中运行UI代码。这个“ResultListener”是如何运行的?ResultListener是一个简单的类,它进行一些计算,并被其他类调用。它没有任何UI组件。如何使其作为UI线程运行?但该代码是如何运行的?这叫什么?SWT Display类有asyncExec和syncExec方法来在UI线程中运行代码,但从外观上看,所有这些代码都应该在UI线程中。它由“分析启动”类调用,该类创建一个线程,以使用其运行方法将数据填充到ResultsListener中。我需要相同的数据来填充视图的小部件。因此,在通过Id获取视图之后,我是否应该创建一个新的UI线程并调用使用该线程的方法?在SWT中,只有一个UI线程,您不能创建一个新的UI线程。相反,将您的UI代码(您在其中获得“无效线程访问”)放入
Runnable
中,并通过
Display\asyncE执行它‌xec(…)
显示同步‌xec(…)
“无效线程访问”表示您正在非UI线程中运行UI代码。这个“ResultListener”是如何运行的?ResultListener是一个简单的类,它进行一些计算,并被其他类调用。它没有任何UI组件。如何使其作为UI线程运行?但该代码是如何运行的?这叫什么?SWT显示类有asyncExec和syncExec方法在UI线程中运行代码,但从外观上看