Eclipse RCP - 如何在工作台初始化之前关闭

时间:2015-02-13 20:13:10

标签: java rcp e4

我在下面有类似的设置:

<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进行)

关于如何做到这一点的任何想法/建议?

2 个答案:

答案 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/