窗口组件动态刷新问题,在dotnet中根本不算什么问题,用几句代码很轻松就能搞定,但是在Swing中,实现动态刷新组件内容却是一件颇为吃力的事情。譬如针对我们经常用到的刷新JLable、JTextField等组件内容,这些组件本身也提供有诸如updateUI()、validate()以及paintImmediately()等等与界面刷新和组件重绘相关的方法, 但是在常规情况下都不起作用。

我们先看个基本的例子,JLabel内容动态刷新的例子,代码如下。

try {
for(int i=0;i<5;i++) {
this.lbInfo.setText(String.format("当前进度:%s", i));
this.lbInfo.paintImmediately(this.lbInfo.getBounds());
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}

我们在一个for循环内每间隔一秒钟刷新一下Label内容,以期望实现Label内容动态刷新效果,但是并没有出现我们想象中的效果,Label内容一直保持不变,直到最后才显示最终的效果,中间的动态内容完全被忽略过去了。这是因为每次调用setText都是运行在主线程中,而且是顺序的执行的。在前面几次调用setText后,线程并没有退出,所以界面刷新线程不能获得执行刷新的机会。而当最后一次setText后,线程退出,界面才能执行刷新。所以我们只能看到最后一次setText的值。

原来,在Java Swing中,界面刷新是线程同步的,也即是说,在同一时间,只有一个线程能够执行刷新界面的代码。如果要多次不断地刷新界面,必须在多线程中调用刷新的方法。我们将以上的代码更改为多线程模式,重新运行,结果就完全实现了我们所期望的动态刷新效果。代码如下。

new Thread(new Runnable(){
@Override
public void run() {
try {
for(int i=0;i<5;i++) {
lbInfo.setText(String.format("当前进度:%s", i));
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();

那么,除了这种采用显式多线程模式外,还有没有其他方法实现内容动态刷新效果呢?我们进行了测试,还真的找到了一种方法,就是结合JScrollPane实现及时动态刷新。在窗体区域创建一个JScrollPane组件,然后将JLabel组件放入JScrollPane中,执行以下代码,同样可以实现内容及时动态刷新。代码如下:

try {
for(int i=0;i<5;i++) {
this.lbInfo.setText(String.format("当前进度:%s", i));
this.lbInfo.paintImmediately(this.lbInfo.getBounds());
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}

做一个小小的总结,针对JLableJ、TextField和JTextArea等组件内容的及时动态刷新问题,基本上采用多线程或者JScrollPane方式都可以实现。但是,对于JTextArea组件,如果不采用多线程模式,在内容动态刷新的时候,JTextArea的滚动条将无法与内容区域保持同步。所以最稳妥可靠的做法,就是采用多线程模式实现内容的及时动态刷新。在下一章节中,我们将利用JScrollPane、JTextArea、多线程和Java自定义事件机制,设计实现一个“日志信息前台监控器”,利用前台窗体实时监控显示后台服务的日志信息。

作者:商兵兵

单位:河南省电力科学研究院智能电网所

QQ:52190634

主页:http://www.cnblogs.com/shangbingbing

空间:http://shangbingbing.qzone.qq.com

Swing应用开发实战系列之四:组件内容实时刷新问题的更多相关文章

  1. Swing应用开发实战系列之五:后台日志信息前台监控器

    作为一个程序设计人员,我们深知日志的重要性,对于日志的监控,我们通常不外乎采用以下两种方式:日志文件方式和后台打印方式,常规情况下,这两种日志监控方式完全可以满足我们对日志监控的需要.但是,当我们用S ...

  2. Swing应用开发实战系列之一:自定义JdbcTemplate

    笔者本人真正意义上接触编程开发是在2004年,最早用的就是VB,然后是Delphi等,后来转到.Net,中间断断续续还用过PowerBuilder等,无一例外,所研发设计的项目或系统都是WinForm ...

  3. Swing应用开发实战系列之二:设计日期选择面板窗口

    Swing本身没有提供什么华丽丽的日期时间选择控件,所以笔者就在网上搜了个第三方的jar包jdatepicker-1.3.2.jar,基于此设计了个很轻量的日期选择面板,很简单的.效果图如下所示: 代 ...

  4. Swing应用开发实战系列之三:动态信息提示窗口

    这里所说的“动态信息提示窗口”可不同于JOptionPane中的Message窗口和Confirm窗口,它们都是静态的模态的,更重要的是线程阻塞的,迫使你必须选择某个动作才能继续执行.我们接下来要分享 ...

  5. WCF开发实战系列二:使用IIS发布WCF服务

    WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...

  6. WCF开发实战系列四:使用Windows服务发布WCF服务

    WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...

  7. WCF开发实战系列五:创建WCF客户端程序

    WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...

  8. WCF开发实战系列一:创建第一个WCF服务

    WCF开发实战系列一:创建第一个WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在这个实战中我们将使用DataContract,ServiceContract ...

  9. WCF开发实战系列三:自运行WCF服务

    WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...

随机推荐

  1. [Architect] Abp 框架原理解析(3) DynamicFilters

    本节目录 介绍 定义Filter 设置Filter 这是Abp中多租户.软删除.激活\禁用等如此方便的原因 Install-Package EntityFramework.DynamicFilters ...

  2. ASP.NEt MVC5--创建下拉列表

    Adding Search by Genre If you added the HttpPost version of the Index  method, delete it now. Next, ...

  3. 【循序渐进学Python】7.面向对象的核心——类型(上)

    我们知道Python是一门面向对象的脚本语言.从C#的角度来看:首先Python支持多继承.Python 类型成员通常都是public的,并且所有成员函数都是virtual的(可以直接重写). 1. ...

  4. SQL Server 性能调优(一)——从等待状态判断系统资源瓶颈【转】

    转载自:http://blog.csdn.net/dba_huangzj/article/details/7607844#comments 通过DMV查看当时SQL SERVER所有任务的状态(sle ...

  5. Qt 框架 开发HTTP 服务器 开发记录

    最近需求需要开发一款 HTTP ,然后由于先前接触过Qt,就直接用Qt写HTTP服务器了,也是为了当作练手,要不然是直接上HTTP框架的. 后端用C++ Qt框架 前端为了练手 当然是纯生的 js h ...

  6. 媒体对象 - Media Objects(摘录)

    原文链接:http://www.jianshu.com/p/6443be21efbd 一个媒体对象由以下及部分组成 父容器 .media 媒体部分 .media-left 或者 .media-righ ...

  7. [翻译]:SQL死锁-为什么会出现死锁

    下面这篇对理解死锁非常重要,首先死锁是如何产生的我们要清楚. We already know why blocking occurs in the system and howto detect an ...

  8. FAQ_1_陌生的VERSION.SDK_INT

    看到VERSION.SDK_INT不禁诧异,这是何物?! 看API的定义,如下: 原来是一个常量值.但是这个常量值可以根据系统的不同而不同哟!为了揭开其神秘的面纱,将源码ctrl如下: 可以看出,获取 ...

  9. 调试CRM JS开发

    CRM 2013 的表单是一个IFrame,如果使用jquey来控制表单的话调试起来比较麻烦,如果直接使用浏览器(firefox)来开发和验证脚本可能会事半功倍. 首页列表页主窗体:var table ...

  10. SharePoint 2013 App Remote Event Receivers

    当我们在使用App的时候,就会发现一些问题,比如那些网站部署.更新或者卸载了,我们很关心我们的App是否有人用,这就需要远程事件接收器了. 1.在我们的测试App的解决方案上选中鼠标,按F4弹出属性, ...