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支持,我们把 ...
随机推荐
- SQL Server存储过程复习(一)
--存储过程学习篇 --.简单存储过程不带参数的学习 IF OBJECT_ID('Orders_GetAllOrders','P') IS NOT NULL DROP PROCEDURE Orders ...
- H5案例学习笔记
★基础篇 增加主体结构元素
- .NET中Debug模式与Release模式
Visual Studio 项目对程序的发布和调试版本分别有单独的配置.顾名思义,生成调试版本的目的是用于调试,而生成发布版本的目的是用于版本的最终分发. 如果在 Visual Studio 中创建程 ...
- MVC中视图View向控制器传值的方法
MVC中视图View向控制器传值的方法步骤如下: 1.index页面: 页面中只需要一个触发事件的按钮
- ACdrea 1217---Cracking' RSA(高斯消元)
ACdrea 1217---高斯消元 Description The following problem is somehow related to the final stage of many ...
- [moka同学摘录]iptables防火墙规则的添加、删除、修改、保存
文章来源:http://www.splaybow.com/post/iptables-rule-add-delete-modify-save.html 本文介绍iptables这个Linux下最强大的 ...
- linux多线程-互斥&条件变量与同步
多线程代码问题描述 我们都知道,进程是操作系统对运行程序资源分配的基本单位,而线程是程序逻辑,调用的基本单位.在多线程的程序中,多个线程共享临界区资源,那么就会有问题: 比如 #include < ...
- 编写运行R脚本
1.在后台运行R 1.1 创建file.R文件 1.2 在文件首行键入: #! /path/to/Rscript 1.3 在下面的行中,键入R代码 1.4 保存(记得有png(),jpeg(),... ...
- Android5.0新特性——全新的动画(animation)
全新的动画 在Material Design设计中,为用户与app交互反馈他们的动作行为和提供了视觉上的连贯性.Material主题为控件和Activity的过渡提供了一些默认的动画,在android ...
- Chrome使用技巧(几个月的心得)
转用Chrome,不仅仅因为它的插件之丰富,更因为它的响应速度其他浏览器都望尘莫及.接着我就要写写一些心得. 如何最简易地用上谷歌搜索? 1,下载hosts文件:https://pan.baidu.c ...