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