快速业务通道

SwingUtilities中invokeLater和invokeAndWait的介绍 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

SwingUtilities中invokeLater和invokeAndWait的介绍

时间:2011-06-21 BlogJava zht

在Java中Swing是线程不安全的,是单线程的设计,这样的造成结果就是:只 能从事件派发线程访问将要在屏幕上绘制的Swing组件。事件派发线程是调用 paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方 法,例如,ActionListener中的actionPerformed方法在事件派发线程中调用。

Swing是事件驱动的,所以在回调函数中更新可见的GUI是很自然的事情,比 如,有一个按钮被按下,项目列表需要更新时,则通常在与该按钮相关联的事件 监听器的actionPerformed方法中来实现该列表的更新,从事件派发线程以外的 线程中更新Swing组件是不正常的。

有时需要从事件派发线程以外的线程中更新Swing组件,例如,在 actionPerformed中有很费时的操作,需要很长时间才能返回,按钮激活后需要 很长时间才能看到更新的列表,按钮会长时间保持按下的状态只到 actionPerformed返回,一般说来耗时的操作不应该在事件处理方法中执行,因 为事件处理返回之前,其他事件是不能触发的,界面类似于卡住的状况,所以在 独立的线程上执行比较耗时的操作可能更好,这会立即更新用户界面和释放事件 派发线程去派发其他的事件。

SwingUtilities类提供了两个方法:invokeLate和invoteAndWait,它们都使 事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时, 就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代 码块。

只有从事件派发线程才能更新组件。

程序示例:更新组件的错误方法

startButton.addActionListener(new ActionListener() {   public void actionPerformed(ActionEvent e) {    GetInfoThread t = new GetInfoThread(Test.this);    t.start();    startButton.setEnabled(false);   }   });   class GetInfoThread extends Thread { Test applet; public GetInfoThread(Test applet) {   this.applet = applet; }   public void run() {   while (true) {    try {    Thread.sleep(500);    applet.getProgressBar().setValue(Math.random() * 100);    } catch (InterruptedException e) {    e.printStackTrace();    }   }   } }

SwingUtilities中invokeLater和invokeAndWait的介绍(2)

时间:2011-06-21 BlogJava zht

错误分析:在actionPerformed中,监听器把按钮的允许状态设置为false, 由于是在事件派发线程上调用actionPerformed,所以setEnabled是一个有效的 操作,但是在GetInfoThread中设置进度条是一个危险的做法,因为事件派发线 程以外的线程更新了进度条,所以运行是不正常的。

1、invokeLater使用

class GetInfoThread extends Thread {   Test applet;   Runnable runx;   int value;   public GetInfoThread(final Test applet) {   this.applet = applet;   runx = new Runnable() {    public void run() {    JProgressBar jpb = applet.getProgressBar();    jpb.setValue(value);    }   };   }   public void run() {    while (true) {    try {     Thread.sleep(500);     value = (int) (Math.random() * 100);     System.out.println(value);     SwingUtilities.invokeLater(runx);    } catch (InterruptedException e) {     e.printStackTrace();    }    }   }   }

2、invokeAndWait

与invoikeLater一样,invokeAndWait也把可运行对象排入事件派发线程的队 列中,invokeLater在把可运行的对象放入队列后就返回,而invokeAndWait一直 等待知道已启动了可

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号