java - 从 Eclipse RCP 中的向导调用复杂操作的正确方法是什么?

标签 java eclipse asynchronous eclipse-plugin eclipse-rcp

我正在尝试从向导启动复杂的操作。

它包括显示一些 View ,然后启动这个 View ,这很长。

第一种方法我只是从向导的 performFinish()

调用 View 创建代码

但这并不漂亮,因为向导一直在按 Finish 按钮。用户不会看到执行开始。

我试图从 performFinish() 调用 Eclipse 命令的其他方式,并编写了处理程序来处理此命令。我在想这会增加一些异步性。

不幸的是,我找不到将复杂对象传递给命令的方法。方法 org.eclipse.core.commands.Command.executeWithChecks(ExecutionEvent) 接受 ExecutionEvent,它允许传递参数映射,但值应该都是 String 类型。 ExecutionEvent 是最终的,我无法通过自己的属性添加到它。

那么从 Eclipse RCP 中的向导调用复杂操作的正确方法是什么?

更新

如果我尝试使用 Job,我会得到 org.eclipse.swt.SWTException: Invalid thread access

更新 2

IRunnableWithProgress 也是如此。

可能我需要将 View 初始化放到另一个线程中...

最佳答案

作为使用 Job 的替代方法,您还可以让向导在代码运行时在向导底部显示进度条。做这个调用

setNeedsProgressMonitor(true);

在您的Wizard 的构造函数中。

performFinish 中使用:

getContainer().run(true, true, new WorkClass());

其中 WorkClass 是您定义的实现 IRunnableWithProgress 的类:

class WorkClass implements IRunnableWithProgress
{
  @Override
  public void run(final IProgressMonitor monitor)
     throws InvocationTargetException, InterruptedException
  {
    // Your work here updating the progress monitor
  }
}

使用此代码,您的向导将保持打开状态并显示进度条,直到工作完成。使用 Job 向导将关闭,进度将显示在状态行或弹出对话框中。

在这两种情况下,您都需要使用 Display.asycnExecDisplay.syncExec 来更新 UI:

Display.getDefault().asyncExec(new Runnable()
  {
    @Override
    public void run()
    {
       // Work which updates the UI
    }
  });

关于java - 从 Eclipse RCP 中的向导调用复杂操作的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21607537/

相关文章:

java - 从指定的相对路径遍历目录中的所有文件

java - 有没有办法在 java 语言(非 native )JVM 代理中启用 "native method prefix"功能?

mysql - 运行时 java.lang.ClassNotFoundException : com. mysql.jdbc.Driver (eclipse/maven/tomcat)

node.js - 将 async.js 与 Node.js 结合使用

java - 代号一,操作事件不起作用 - 需要解释

java - CLI 中的 JUnit 测试等效项

eclipse - Windows 8 上的 Xampp : Error Attemting to start tomcat service

Javascript 多个文件上传,一次一个

windows - (UWP) WebClient 和从 URL 下载数据

java - 使用 Java 连接到 Oracle DSN 时出错