3

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

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

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

4

4 回答 4

2

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

于 2013-10-21T20:43:45.147 回答
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 将其注入您的处理程序。

于 2013-02-25T09:34:58.580 回答
2

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 代码依赖!

于 2012-10-30T11:40:10.663 回答
0

你可以试试这个

    public void restart() {Display.getDefault().asyncExec(new Runnable(){
         @Override
          public void run() {
          PlatformUI.getWorkbench().restart();
        }
    });
于 2020-04-17T08:14:15.470 回答