Eclipse RCP - 如何在 workbench 初始化之前关闭
Eclipse RCP - How to shutdown before workbench initializes
我的设置与下面类似:
<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)
任何关于如何做到这一点的ideas/suggestions?
PlatformUI
在 e4 应用程序中不可用,请勿尝试使用它。
@PostConstruct
在 LifeCycle class 中做任何事情都太早了。您应该尝试做任何事情的第一点是 @PostContextCreate
方法。
您可以注入 org.eclipse.e4.ui.workbench.IWorkbench
并调用 close
方法来关闭 e4 应用程序。但是 workbench 在应用程序启动完成之前不可用,因此您需要等待此事件。
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();
}
}
如果您使用的是 SWT 渲染器,System.exit() 是当前中止 E4 启动的唯一方法。
如果您使用来自 e(fx)clipse 的 JavaFX 渲染器,您可以 return FALSE 从 @PostContextCreate 到关闭。
有关详细信息,请参阅此博客:
http://tomsondev.bestsolution.at/2014/11/03/efxclipse-1-1-new-features-api-to-restart-your-e4-app-on-startup/
我的设置与下面类似:
<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)
任何关于如何做到这一点的ideas/suggestions?
PlatformUI
在 e4 应用程序中不可用,请勿尝试使用它。
@PostConstruct
在 LifeCycle class 中做任何事情都太早了。您应该尝试做任何事情的第一点是 @PostContextCreate
方法。
您可以注入 org.eclipse.e4.ui.workbench.IWorkbench
并调用 close
方法来关闭 e4 应用程序。但是 workbench 在应用程序启动完成之前不可用,因此您需要等待此事件。
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();
}
}
System.exit() 是当前中止 E4 启动的唯一方法。
如果您使用来自 e(fx)clipse 的 JavaFX 渲染器,您可以 return FALSE 从 @PostContextCreate 到关闭。
有关详细信息,请参阅此博客: http://tomsondev.bestsolution.at/2014/11/03/efxclipse-1-1-new-features-api-to-restart-your-e4-app-on-startup/