Swing应用开发实战系列之四:组件内容实时刷新问题
窗口组件动态刷新问题,在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
Swing应用开发实战系列之四:组件内容实时刷新问题的更多相关文章
- Swing应用开发实战系列之五:后台日志信息前台监控器
作为一个程序设计人员,我们深知日志的重要性,对于日志的监控,我们通常不外乎采用以下两种方式:日志文件方式和后台打印方式,常规情况下,这两种日志监控方式完全可以满足我们对日志监控的需要.但是,当我们用S ...
- Swing应用开发实战系列之一:自定义JdbcTemplate
笔者本人真正意义上接触编程开发是在2004年,最早用的就是VB,然后是Delphi等,后来转到.Net,中间断断续续还用过PowerBuilder等,无一例外,所研发设计的项目或系统都是WinForm ...
- Swing应用开发实战系列之二:设计日期选择面板窗口
Swing本身没有提供什么华丽丽的日期时间选择控件,所以笔者就在网上搜了个第三方的jar包jdatepicker-1.3.2.jar,基于此设计了个很轻量的日期选择面板,很简单的.效果图如下所示: 代 ...
- Swing应用开发实战系列之三:动态信息提示窗口
这里所说的“动态信息提示窗口”可不同于JOptionPane中的Message窗口和Confirm窗口,它们都是静态的模态的,更重要的是线程阻塞的,迫使你必须选择某个动作才能继续执行.我们接下来要分享 ...
- WCF开发实战系列二:使用IIS发布WCF服务
WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...
- WCF开发实战系列四:使用Windows服务发布WCF服务
WCF开发实战系列四:使用Windows服务发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇文章中我们通过编写的控制台程序或WinForm程序来为本 ...
- WCF开发实战系列五:创建WCF客户端程序
WCF开发实战系列五:创建WCF客户端程序 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在前面的三篇文章中我们分别介绍了WCF服务的三种载体:IIS.Self-Hos ...
- WCF开发实战系列一:创建第一个WCF服务
WCF开发实战系列一:创建第一个WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在这个实战中我们将使用DataContract,ServiceContract ...
- WCF开发实战系列三:自运行WCF服务
WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...
随机推荐
- P6 Enterprise Project Portfolio Contract Management
Find documentation for Primavera products here: Primavera Cloud Services Primavera Prime Primavera P ...
- 正则表达式相关:C# 抓取网页类(获取网页中所有信息)
类的代码: using System; using System.Data; using System.Configuration; using System.Net; using System.IO ...
- ExtJs特点、优缺点及注意事项
摘自:ExtJs特点.优缺点及注意事项 1.什么是ExtJs?ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的 ...
- Aspose.Word 操作word表格的行 插入行 添加行
rows.insert或rows.add前row必须有单元格cell private void button3_Click(object sender, EventArgs e) { ...
- WebGL/X3DOM 跑在 iOS
iOS是最早支持WebGL的移动操作系统之一,我们一直在努力让X3DOM运行在那些设备上.然而,标准的Safari浏览器默认是没有开启的.这种情况从iOS8发生改变,iOS8现在完全支持WebGL - ...
- css样式reset
初始化样式. @CHARSET "UTF-8"; body,ur,ol,li,p,h1,h2,h3,h4,h5,h6,form,fieldset,table,td,img,div, ...
- Mysql denied for user 'odbc@localhost' || denied for user 'root@localhost'
1. Question Description: 1.1 mysql version: mysql-5.7.11-win64.zip 1.2 if you connect to the mys ...
- 【JVM】2、关于jdk7的MethodHandle类
关于MethodHandle类,这个类是在jdk1.7之后加入的,这个类的作用类似函数指针的意思 这个类中有一个方法 这里我的jdk有一个问题,就是我在进行MethodHandle操作的时候,我们会发 ...
- Eclipse 出现Some sites could not be found. See the error log for more detail.错误 解决方法
Eclipse 出现Some sites could not be found. See the error log for more detail.错误 解决方法 Some sites could ...
- SQL数据库基础(二)
数据类型: --类似于C#中的数据类型 Datetime 范围是:1753.1.1—— 9999.12.31 Smalldatetime 1900.1.1 ——2079.6.6 操作: ...