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

时间:2014-02-06 15:49:18

标签: java eclipse asynchronous eclipse-plugin eclipse-rcp

我正试图从向导中启动复杂的操作。

它包括显示一些视图,然后启动此视图,这很长。

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

调用视图创建代码

但这并不漂亮,因为向导按下了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相同。

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

2 个答案:

答案 0 :(得分:4)

作为使用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来更新用户界面:

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

答案 1 :(得分:1)

如果您在向导结束时执行长时间运行或复杂的任务,则最好只使用向导来收集和验证信息。在performFinish()上,您可以使用Eclipse Jobs API异步执行任务。

    Job job = new Job("name") {
        @Override
        protected IStatus run(IProgressMonitor monitor) {
            // TODO Complex task
            return Status.OK_STATUS;
        }
    };
    job.schedule();

如果您将进度信息反馈给IProgressMonitor,那么该作业的状态将显示在Eclipse进度视图中。

要从向导传递信息,您可以使用自己的类扩展Job,也可以在向导类中使用作业代码访问字段或最终变量。