进度条是构建良好的用户界面必备的组件之一,下面总结一下在基于 Eclipse RCP 开发应用程序时显示进度条的几种方法 :
- 使用 ProgressMonitorDialog 对话框
ProgressMonitorDialog 是用于显示进度条的对话框,它必须配合接口 IrunnableWithProgress 进行使 用, IRunnableWithProgress 定义了一个可监控进度的任务对象 , 针对具体的业务逻辑实现其 run(IProgressMonitor monitor) 方法即可,整个的用法如下代码所示:
view plain copy to clipboard print ?
- ProgressMonitorDialog pmd = new ProgressMonitorDialog(window.getShell());
- IRunnableWithProgress rwp = new IRunnableWithProgress() {
- @Override
- public void run(IProgressMonitor monitor){
- //totalWork为IProgressMonitor.UNKNOWN时表示不知道任务的总量
- //将在进度条上显示一个来回移动的进度条
- monitor.beginTask("任务1" + "", IProgressMonitor.UNKNOWN);
- //TODO 相应的业务逻辑
- monitor.done();
- }
- }
- pmd.run(true, false, rwp);
ProgressMonitorDialog pmd = new ProgressMonitorDialog(window.getShell());IRunnableWithProgress rwp = new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor){ //totalWork为IProgressMonitor.UNKNOWN时表示不知道任务的总量 //将在进度条上显示一个来回移动的进度条 monitor.beginTask("任务1" + "", IProgressMonitor.UNKNOWN); //TODO 相应的业务逻辑 monitor.done(); }}pmd.run(true, false, rwp);
方法 run(boolean fork,boolean canceled,IrunnableWithProgress p) 中,第一个参数 fork 表示是否在事件队列(即 UI 线程)中运行,如果设置为 false, 表示将在事件队列中运行,第二个参数 canceled 表示任务是否能够被取消。
执行 pmd.run(false, false, rwp) 时的进度条显示:
- 使用 RCP 平台的进度条服务 IProgressService ;
IProgressService 是 RCP 提供给客户程序执行一个耗时任务的方便快捷的方法,具体用法如下
1)执行非UI的操作时
view plain copy to clipboard print ?
- IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
- progressService.busyCursorWhile(new IRunnableWithProgress(){
- public void run(IProgressMonitor monitor) {
- // 非UI线程,只能进行非UI的操作
- }
- });
IProgressService progressService = PlatformUI.getWorkbench().getProgressService(); progressService.busyCursorWhile(new IRunnableWithProgress(){ public void run(IProgressMonitor monitor) { // 非UI线程,只能进行非UI的操作 } });
2)执行UI的操作时
view plain copy to clipboard print ?
- progressService.runInUI(
- PlatformUI.getWorkbench().getProgressService(),
- new IRunnableWithProgress() {
- public void run(IProgressMonitor monitor) {
- // UI主线程,可进行UI操作
- }
- },
- Platform.getWorkspace().getRoot());
progressService.runInUI( PlatformUI.getWorkbench().getProgressService(), new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { // UI主线程,可进行UI操作 } }, Platform.getWorkspace().getRoot());
Job 默认支持进度条的显示,启动一个Job时会自动打开一个进度条,如果Job调用了方法setUser(true),将会弹出一个进度条对话框表示是用户作业,如果setUser(true),则表示作业在后台运行,进度条将在进度条视图中运行。
IWizard w;
w.getContainer().run(fork, cancelable, runnable);
以上代码表示在当前向导页上运行一个可监控进度的任务;