`
soleegn
  • 浏览: 147584 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论
阅读更多

    我讨论的进度条主要是JFace的进度条,RCP已经提供了完善的Job组件,为什么还要用JFace的进度条呢?原因是我要在登陆界面上做进度处理,也就是使用Eclipse3.3提供的AbstractSplashHandler特性,可以将原有的启动画面替换成为一个登陆界面,启动这个登陆界面时,Eclipse的Platform此时还没有启动,所以不能使用RCP本身的Job组件了。

    由于是一个检测服务器是否联通的测试,所以并不知道测试的真实时间,所以就是要使用“傻瓜进度条”了,也就是反复走的进度条陈刚的代码如下:

button.addSelectionListener(new SelectionAdapter() {
            private boolean stopFlag;// 停止标志

            private void go() {
                for (int i = 0; i < 10; i++) {// 循环10次,每次间隔一秒
                    System.out.println("第" + (i + 1) + "个任务执行完毕");
                    if (stopFlag) {// 监控是否要让停止后台任务
                        System.out.println("被中断了");
                        return;
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (Throwable t) {}
                }
                stopFlag = true;// 执行完毕后把标志位设为停止,好通知给进度框
                System.out.println("全部任务执行完毕");
            }

            public void widgetSelected(SelectionEvent e) {
                stopFlag = false;// 每次都设初值为false
                new Thread() {// 把后台任务放到一个新开线程里执行
                    public void run() {
                        go();
                    }
                }.start();
                showProgressDialog();// 打开一个进度框
            }

            private void showProgressDialog() {
                IRunnableWithProgress runnable = new IRunnableWithProgress() {
                    public void run(IProgressMonitor monitor) {
                        monitor.beginTask("正在执行中......", 30);
                        int i = 0;
                        while (true) {
                            // 监听是否单击了进度框的“取消”按钮,stopFlag则是监听后台任务是否停止
                            if (monitor.isCanceled() || stopFlag) {
                                stopFlag = true; // 单击了“取消”按钮要设标志位为停止,好通知后台任务中断执行
                                break;// 中断处理
                            }
                            // i到30后清零。并将进度条重新来过
                            if ((++i) == 30) {
                                i = 0;
                                monitor.beginTask("正在执行中......", 30);
                            }
                            // 进度条每前进一步体息一会,不用太长或太短,时间可任意设。
                            try {
                                Thread.sleep(99);
                            } catch (Throwable t) {}
                            monitor.worked(1);// 进度条前进一步
                        }
                        monitor.done();// 进度条前进到完成
                    }
                };
                try {
                    new ProgressMonitorDialog(s).run(true, true, runnable);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

 

    主要是使用两个线程交替使用,第一个线程处理业务,第二个线程监控第一个线程查看它是否结束,如果结束或者被点击cancele则停止进度条的进程,如果一直没有关闭的指令,则反复开始---累加---结束---开始---累加---结束。

    我们几乎是把陈刚的代码原原本本的抄袭了一下,仅仅是替换了go()中的内容,但是发现一个问题

new ProgressMonitorDialog(s).run(true, true, runnable);
使用此句的话,JFace的线程永远不会启动;

替换为

new ProgressMonitorDialog(s).run(false, true, runnable);
使用此句的话,JFace的线程可以启动,运行正常,但是cancele不能响应,UI界面完全卡死!

    第一个参数的名字fork~乍看去,什么意思都没有,但是看看API才发现内藏很大的玄机,如果为true则此线程为一个非UI线程,大家知道非UI线程是不会阻塞UI的;如果为false则此线程为一个UI线程,大家也知道UI线程如果使用不当很容易阻塞UI的。

    关键的问题是我们和陈刚的代码几乎一摸一样他的进度条就启动,我的进度条就不启动!为什么?(这点至今不明白!)

    详查API发现如果fork为false的时候还是另有洞天的:

This implementation of IRunnableContext#run(boolean, boolean, IRunnableWithProgress) runs the given IRunnableWithProgress using the progress monitor for this progress dialog and blocks until the runnable has been run, regardless of the value of fork. The dialog is opened before the runnable is run, and closed after it completes. It is recommended that fork is set to true in most cases. If fork is set to false, the runnable will run in the UI thread and it is the runnable's responsibility to call Display.readAndDispatch() to ensure UI responsiveness.

API中说的很明白,如果fork为false时需要在线程中调用Display.readAndDispatch()方法,以避免UI被阻塞!

大家如果在JFace的开发中如果使用了进度条,发现UI被阻塞的话,就想想我哦!!!呵呵只用在进程中调用一下Display.readAndDispatch()就解决了!

分享到:
评论

相关推荐

    swt/jface实例开发

    而JFace则在SWT的基础上构建了一个更高层次的抽象,简化了GUI的开发,特别是数据绑定和视图模型的管理。 SWT的核心特性包括: 1. **原生控件**:SWT通过JNI(Java Native Interface)直接调用操作系统提供的API,...

    SWT_JFace.rar_swt/jface

    SWT是用于构建图形用户界面(GUI)的基础组件库,而JFace则是建立在SWT之上,提供了一种更高层次、更抽象的API,使得开发者能够更容易地创建复杂的用户界面。 1. SWT (标准小部件工具包) SWT 是一个开源的Java库,...

    SWT.rar_SWT_jface教程

    JFace则是建立在SWT基础之上的一层抽象,它简化了GUI开发的复杂性,提供了一种面向对象的模型,使得开发者可以更专注于业务逻辑而不是底层细节。JFace的核心概念包括数据绑定、视图、控制器等,这些概念可以帮助我们...

    JFace_SWT.doc

    #### 一、SWT与JFace简介 SWT(Standard Widget Toolkit)和 JFace 是 Eclipse 平台的核心组成部分之一,它们主要用于构建基于 Java 的图形用户界面(GUI)。SWT 提供了一套跨平台的低级 API,而 JFace 则建立在 ...

    SWT,JFACE核心应用源代码,第二部分.rar

    总之,这个压缩包中的源代码将提供一个宝贵的实践平台,帮助开发者深入学习和掌握SWT和JFace的使用,从而提升在Java GUI开发领域的技能。通过分析和运行这些示例,开发者能够更好地理解这两个库的强大功能,以及如何...

    Eclipse_Swt_Jface_核心应用_part10--15_of_19

    JFace的DataBinding使得数据模型和界面元素之间的同步变得容易,而其视图框架则有助于构建结构化的用户界面。在这些章节中,我们可能学习到了如何利用JFace的这些特性来构建更加模块化和可维护的应用程序。 在第10...

    SWT(JFace) 简易浏览器 制作实现代码第1/2页

    在本文中,我们将深入探讨如何使用SWT (Standard Widget Toolkit) 和JFace库来创建一个简易的Web浏览器。SWT是Eclipse项目的一部分,提供了一组原生的GUI控件,使得开发者可以创建与操作系统风格一致的应用程序。...

    如何创建简单的SWT 应用程序.pdf清晰版

    SWT提供了一组丰富的本地外观控件,而JFace则在此基础上进一步提供了一系列高级功能。 #### SWT概述 SWT是一个Java GUI工具包,旨在为开发者提供一种接近原生应用体验的方式来构建用户界面。与Swing不同,Swing...

    多个SWT例子

    SWT是底层的GUI库,提供了与操作系统直接交互的原生控件,而JFace则建立在SWT之上,提供了一层抽象,简化了开发过程并增加了可复用性。 1. SWT (标准小部件工具包): SWT 是一个开源的 Java 库,允许开发者创建与...

    SwtJfaceInAction

    SWT是Eclipse平台的基础,它提供了丰富的GUI组件,而JFace则在SWT的基础上构建了一层抽象,使得开发更为简洁且具有面向对象的特性。 1. **SWT概述**:SWT是Eclipse用于构建图形用户界面的基础库,它是开源的,并且...

    java程序设计之swt教程

    在实际项目中,开发者通常会结合JFace库使用SWT,JFace提供了一些高级抽象和便利的功能,如数据绑定、视图和编辑器框架等,简化了SWT的使用。JFace的`ViewPart`和`EditorPart`类可以帮助构建Eclipse插件和RCP(Rich ...

    SWT(JFace)体验之Slider,Scale

    JFace是建立在SWT之上的更高层次的框架,它简化了SWT组件的使用,并提供了数据绑定、事件处理等高级功能。在本文中,我们将探讨如何使用SWT中的Slider和Scale控件,通过代码实例来深入理解这两个组件的用法。 首先...

    Eclipse插件开发学习笔记6-11章

    SWT(Standard Widget Toolkit)是Eclipse提供的原生控件库,提供了与操作系统紧密集成的GUI组件,而JFace则是建立在SWT之上的一层抽象,简化了UI开发,使得代码更简洁、可读性更强。本章会讲解如何使用这两者来创建...

    SWT Swing与AWT区别

    AWT是Java最初的GUI库,它的优点在于其稳定性和广泛的可用性,因为它是Java标准的一部分,无需额外安装即可在任何Java运行环境中使用。然而,AWT的设计采用了一个最低共同标准(LCD)的方法,导致其组件和功能相对...

    批量改名工具(批量修改文件名)

    在IT行业中,文件管理是一项基础但至关重要的任务。有时候,我们可能会遇到大量文件需要统一更改文件名的情况,这时批量改名工具就显得尤为...而对于经验丰富的开发者,这样的工具则能提高日常工作效率,减少重复劳动。

    swt-3.7.2-win32-win32-x86-source.rar

    7. **与JFace和Eclipse RCP的集成**:SWT是Eclipse Rich Client Platform (RCP) 的基础,JFace则是在SWT之上提供更高层次的抽象,简化GUI开发。两者结合,开发者可以快速构建复杂的桌面应用程序。 源代码包"swt-...

    Eclipse从入门到精通

    SWT专注于底层的GUI控件实现,提供了丰富的组件和跨平台的支持,而JFace则建立在SWT之上,提供更高层次的应用程序框架,如视图、编辑器、对话框等。它们共同构成了Eclipse强大的GUI开发能力。 #### 开放式、可扩展...

Global site tag (gtag.js) - Google Analytics