【问题标题】:Howto restart an e4 RCP application如何重新启动 e4 RCP 应用程序
【发布时间】:2020-11-25 15:59:43
【问题描述】:

如果 IApplication.start 返回 IApplication.EXIT_RESTART,将重新启动基于 3.* 的 RCP 应用程序。 E4Application 类似乎总是返回 EXIT_OK。

org.eclipse.ui.IWorkbench 也有重启方法,org.eclipse.e4.ui.workbench.IWorkbench 没有。

那么如何重新启动 e4 RCP 应用程序?

【问题讨论】:

    标签: eclipse-rcp e4


    【解决方案1】:

    当前在 Eclipse 4.2 中的实现会导致一个 ID 为 org.eclipse.ui.file.restartWorkbench 的命令,该命令最终会导致处理程序类 RestartWorkbenchHandler。该类实现如下

    public Object execute(ExecutionEvent event){
    
        PlatformUI.getWorkbench().restart();
        return null;
    }
    

    这意味着它依赖于 Eclipse 3.x,因为 PlatformUI 类在纯基于 Eclipse 4 的应用程序中不再可用。所以如果你想在你的 e4 应用程序中解决这个任务,创建一个命令,实现处理程序,目前你将有一些 E3 代码依赖!

    【讨论】:

      【解决方案2】:

      在将此功能引入 e4 之前,我的解决方法如下:我使用 IApplication 实现作为 E4Application 的包装器。这样,我可以从 start 方法返回 IApplication.EXIT_RESTART 并且 Equuniox 将重新启动。

      但请注意,此解决方法使用内部 API,将来可能会发生变化!

      package de.emsw.gosa.e4.application;
      
      import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
      import org.eclipse.equinox.app.IApplication;
      import org.eclipse.equinox.app.IApplicationContext;
      
      public class MyE4Application implements IApplication {
      
          private static MyE4Application instance;
      
          public static MyE4Application getInstance() {
              return instance;
          }
      
          private Integer exitRet = IApplication.EXIT_OK;
          private E4Application e4app;
      
          public void setRestart() {
              exitRet = IApplication.EXIT_RESTART;
          }
      
          @Override
          public Object start(IApplicationContext context) throws Exception {
              instance = this;
              e4app = new E4Application();
              e4app.start(context);
              return exitRet;
          }
      
          @Override
          public void stop() {
              e4app.stop();
          }
      }
      

      当你想重启时,现在可以使用Singleton来设置返回值:

      @Execute
      public void execute(IWorkbench workbench) {
          MyE4Application.getInstance().setRestart();
          workbench.close();
      }
      

      我在这里使用了 Singleton,因为这样更容易解释。更好的解决方案是将您的 IApplication 注册为 OSGi 服务并让 DI 将其注入您的处理程序。

      【讨论】:

        【解决方案3】:

        org.eclipse.e4.ui.workbench.IWorkbench 现在在 Eclipse Kepler (4.3) 中有一个 restart 方法。

        【讨论】:

          【解决方案4】:

          你可以试试这个

              public void restart() {Display.getDefault().asyncExec(new Runnable(){
                   @Override
                    public void run() {
                    PlatformUI.getWorkbench().restart();
                  }
              });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-12
            • 1970-01-01
            • 2021-11-08
            • 2014-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多