Java 在插件启动时访问工作台
我想在插件开始时访问Java 在插件启动时访问工作台,java,eclipse-plugin,Java,Eclipse Plugin,我想在插件开始时访问IWorkbench,以连接IPartListener 最简单的解决方案是在插件的start()方法中添加侦听器: public class MyPlugin extends AbstractUIPlugin { private IPartListener partListener = new MyPartListener(); public void start(BundleContext context) throws PluginException {
IWorkbench
,以连接IPartListener
最简单的解决方案是在插件的start()
方法中添加侦听器:
public class MyPlugin extends AbstractUIPlugin {
private IPartListener partListener = new MyPartListener();
public void start(BundleContext context) throws PluginException {
super.start(context);
Display.getDefault().asyncExec(() ->
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.addPartListener(this.partListener));
}
}
说明:Display#asyncExec
在下次UI线程空闲时运行,这是在创建工作台之后(因为在启动AbstractUIPlugin
时,它已经在创建它的过程中)
该代码在一段时间内运行良好,但在发布后,使用它的其他项目有时会失败:
原因:java.lang.NullPointerException
位于org.acme.project.MyPlugin.lambda$0(MyPlugin.java:43)
位于org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
位于org.eclipse.swt.widgets.Synchronizer.runasynchmessages(Synchronizer.java:135)
显然,在本例中,工作台尚未创建。我将代码移到了IStartup
实现的earlyStartup()
中,现在它适用于所有以前投诉过的项目
由于插件的开始和工作台的创建不是确定性的,我的问题是:这是正确的位置吗?或者这是另一个等待发生的NullPointerException(或任何其他异常)类中
earlyStartup
方法的JavaDoc明确表示它是在工作台初始化后运行的,并描述了执行非常类似的操作,所以这应该是可以的
Javadoc:
将在工作台初始化后在单独的线程中调用
请注意,大多数工作台方法必须在UI线程中调用,因为
他们可以访问SWT。例如,获取当前工作台
窗口,使用:
从技术上讲,你在那条线上打的任何电话都可能是空的。仅仅因为有一个工作台并不意味着有一个活动窗口或活动页面。什么用户操作导致插件启动?@nit没有用户操作,而是应用程序启动的核心捆绑包。
final IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getDisplay().asyncExec(new Runnable() {
public void run() {
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
if (window != null) {
// do something
}
}
});