我正在尝试从向导启动复杂的操作。
它包括显示一些 View ,然后启动这个 View ,这很长。
第一种方法我只是从向导的 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
也是如此。
可能我需要将 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.asycnExec
或 Display.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/