我在下面有类似的设置:
<extension
id="product"
point="org.eclipse.core.runtime.products">
<product
name="%product.name"
application="org.eclipse.e4.ui.workbench.swt.E4Application">
<property
name="lifeCycleURI"
value="bundleclass://plugin-id/package.LifeCycle">
</property>
.... more properties ...
public class LifeCycle
{
@PostConstruct
public void doWork()
{
// Show a login screen. If the user cancels out of it, shut down
// the application.
}
}
在上面的场景中,正确关闭应用程序的正确方法是什么?如果我这样做:
PlatformUI.getWorkbench().close()
我收到错误,因为它尚未初始化。如果我这样做:
System.exit(0)
然后我杀了JVM上的所有其他内容(尽管建议在http://www.vogella.com/tutorials/Eclipse4LifeCycle/article.html进行)
关于如何做到这一点的任何想法/建议?
答案 0 :(得分:1)
PlatformUI
在e4应用程序中不可用,请勿尝试使用它。
@PostConstruct
在LifeCycle类中做任何事情都为时尚早。您应该尝试做的第一点是@PostContextCreate
方法。
您可以注入org.eclipse.e4.ui.workbench.IWorkbench
并调用close
方法来关闭e4应用程序。但是,在应用程序启动完成之前,工作台不可用,因此您需要等待此事件。
public class LifeCycle
{
@PostContextCreate
public void postContextCreate(IEclipseContext context, IEventBroker eventBroker)
{
...
eventBroker.subscribe(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE,
new AppStartupCompleteEventHandler(eventBroker, context));
}
}
class AppStartupCompleteEventHandler implements EventHandler
{
private IEventBroker _eventBroker;
private IEclipseContext _context;
AppStartupCompleteEventHandler(IEventBroker eventBroker, IEclipseContext context)
{
_eventBroker = eventBroker;
_context = context;
}
@Override
public void handleEvent(final Event event)
{
_eventBroker.unsubscribe(this);
IWorkbench workbench = _context.get(IWorkbench.class);
workbench.close();
}
}
答案 1 :(得分:0)
如果您使用SWT渲染器,System.exit()是当前中止E4启动的唯一方法。
如果您使用e(fx)clipse中的JavaFX渲染器,则可以从@PostContextCreate返回FALSE以关闭。
有关更多信息,请参阅此博客: http://tomsondev.bestsolution.at/2014/11/03/efxclipse-1-1-new-features-api-to-restart-your-e4-app-on-startup/