在Plug-in Start中访问Workbench

时间:2016-03-10 11:10:06

标签: java eclipse-plugin

我想在插件开头访问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线程空闲时运行,这是在工作台创建之后(因为它已经在{{1}创建它的过程中启动)。

代码运行良好一段时间,但在发布后,使用它的其他项目有时会失败:

  

引起: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.runAsyncMessages(Synchronizer.java:135)

显然,在这种情况下,工作台尚未创建。我将代码移动到AbstractUIPlugin实现的earlyStartup()中,现在它适用于之前抱怨过的所有项目。

由于插件的开始和工作台的创建不确定,我的问题是:这是正确的地方吗?或者这是另一个等待发生的NullPointerException(或任何其他异常)?

1 个答案:

答案 0 :(得分:0)

config.action_mailer.default_url_options = {host: "example.com"} 类中git config --global pack.windowMemory "32m"方法的JavaDoc明确表示它是在工作台初始化之后运行的,并描述了做非常相似的事情,所以这应该没问题。

的Javadoc:

  

在工作台初始化之后将在单独的线程中调用。

     

请注意,必须在UI线程中调用大多数工作台方法   他们可以访问SWT。例如,获取当前工作台   窗口,使用:

earlyStartup