网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  事件处理中ui的刷新问题(笔记体小品文)     
  文章作者:未知  文章来源:水木森林  
  查看:104次  录入:管理员--2007-11-17  
 
  注:根据yigemaser、jfml、crazyjavar的建议更新,对三位的帮助表示感谢!

在写ui应用时,通常会在一些事件处理的过程中,尤其当这个处理比较耗时的时候,希望能够及时把一些进度信息显示给用户。这时通常大家都会使用一个文本控件来显示这些进度信息。比如下面的程序中,有一个jtextpane和jbutton,在jbutton中的action事件中需要进行一些耗时的处理,例子程序中使用了thread.sleep()使当前线程休眠3秒来模拟耗时的操作。action事件处理分为3步,我们希望及时把当前的进度显示在jtextpane上。
代码如下:

package bruce.test;import javax.swing.*;import java.awt.container;import java.awt.borderlayout;import java.awt.dimension;import java.awt.event.windowadapter;import java.awt.event.actionlistener;import java.awt.event.actionevent;/** * 事件处理过程中ui的刷新 * @author bruce * @version 1.0 */public class testuiupdate2 { public testuiupdate2() { testuiupdate2frame frame = new testuiupdate2frame(); frame.pack(); frame.setvisible(true); } public static void main(string[] args) { new testuiupdate2(); }}class testuiupdate2frame extends jframe { jtextpane pane = new jtextpane(); jbutton button = new jbutton("action..."); testuiupdate2frame() { init(); this.setdefaultcloseoperation(jframe.exit_on_close); button.addactionlistener(new actionlistener() { public void actionperformed(actionevent e){ try { pane.settext("step one..."); thread.sleep(3000); pane.settext("step two..."); thread.sleep(3000); pane.settext("finished."); thread.sleep(3000); } catch (interruptedexception ie) { //ignored } } }); } private void init() { pane.setpreferredsize(new dimension(300,200)); container content = getcontentpane(); content.setlayout(new borderlayout()); content.add(pane, borderlayout.center); content.add(button, borderlayout.south); }}
但在实际运行过程中可以发现,点击jbutton后,jtextpane并不能及时更新,而是在整个jbutton的action事件处理完毕后才能显示出最后的信息。为什么会出现这种情况呢?因为在处理jbutton的action事件过程中,虽然更新了jtextpane的内容,但由于jbutton的事件处理是在当前main线程中运行,虽然jtextpane更新了内容,但没有得到刷新显示的执行机会。

解决这个问题的方法非常简单,只需要把jbutton的action处理代码放入一个新的线程,然后启动这个线程。另外,由于swing的操作大部分是非线程安全的,所以对swing界面的刷新也单独放在一个线程,并调用swingutilities.invokelater()执行。这样action事件处理、更新jtextpane的界面和main主线程就分别运行在各自的线程中,都可以及时得到执行。jbutton的
actionperformed(actionevent e)的处理代码修改如下:[code] button.addactionlistener(new actionlistener() { public void actionperformed(actionevent e){ try { new thread() { public void run() { try { showmessage("step one..."); thread.sleep(3000); showmessage("step two..."); thread.sleep(3000); showmessage("finished."); thread.sleep(3000); } catch (interruptedexception ie) { //ignored } } }.start(); } catch (exception ex) { ex.printstacktrace(); } } });

showmessage方法如下:

private void showmessage (final string msg) { swingutilities.invokelater(new runnable() { public void run() { pane.settext(pane.gettext() + msg); } }); }
大家可以测试运行观察效果。这样也使界面更加友好,因为如果不把action的处理代码放在一个单独的线程中,用户点击jbutton后,界面就停止一切响应,直到action处理代码执行完毕。大家可以扩展这种方法,允许用户随时停止该耗时的操作,使界面更加友好。
 
 
上一篇: 使用模仿对象进行单元测试    下一篇: 事件监听器?将javabeans接通起来的方法
  相关文档
apache geronimo 1.0 m3 released 11-17
Java参数传递方式 03-25
java和jsp编程应该注意的六个常见问题 11-17
websphere性能优化 11-17
java exception 机制 11-17
j2se综合--高手对java中的浮点数分析 01-07
size 属性 11-16
j2me学习笔记(4)—用midp api开发midlets 11-17
建立一个结构合理的概念框架 11-17
开发j2ee应用应遵循的几点原则 11-16
java编程中异常处理的优劣之道 11-17
j2ee1.4中的servlet部署应用 11-17
设计及设计模式:java23种模式一点就通 03-14
jdbc解决方案 11-17
使用rmi和corba进行分布式程序设计 11-17
用java实现irc文本到语音转换 11-17
java多线程编程 11-17
lesson1.04配j2ee环境及cloudscape数据库 11-17
基础:java编写过程中安全问题解决指南 12-27
getfolder 方法 11-16
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息