【转】进度条在事件处理过程中不更新?
2010-03-18 09:39
302 查看
进度条在事件处理过程中不更新?
为什么进度条在事件处理过程中不更新,而是在完成后,从0%调到100%?分两种情况:
1)在AWT事件线程中执行的操作。
当应用程序在事件线程中执行长时间的操作时,会阻塞正常的AWT事件处理,因此阻止了重绘操作的发生。这同常会在下列情况下发生:应用程序响应一个来自用户界面的请求时,在连接到一个按钮或其他GUI组件的事件处理程序中执行任务,任务的内容可能会需要较长时间,使事件线程挂起,直至远程系统发出答复为止。当应用程序调用JProgressBar的setValue方法时,进度条可能更新期内部状态并调用repaint,这样做会把一个事件放置到AWT事件队列中。不幸的是,直至应用程序的事件处理程序完成其处理并把控制权返回到线程的事件处理循环,才能处理该事件。
可以通过调用JComponent的paintImmediately方法来这样做,该方法有两种形式:
public void paintImmediately(int x, int y, int width, int height);
public void paintImmediately(Rectangel rect);
例如:
Dimension d = bar.getSize();
Rectangel rect = new Rectangle(0,0, d.width, d.height);
....
bar.setValue(progressValue);
bar.paintImmediately(rect);
...
2)在另一个线程中执行的操作
如果在一个单独的线程中执行该操作,当调用进度条的setValue方法,它的更新不会出现任何问题,问题在于,后台线程必须调用JProgressBar的setValue。而Swing组件只有在事件线程中才能安全的访问。因此,从执行实际工作的线程调用setValue方法是不安全的!解决的方法是使用SwingUtilites的invokeLater方法,让AWT事件线程稍后进行setValue调用。
例如:
...
SwingUtilities.invokeLater(new Runnable(){
public void run(){
bar.setValue(value);
}
});
...
(From Core JFC)
还有一种可能,不能再线程中改变swing组件,例如,不能从线程调用label.setText,但是可以使用EventQueue类的invokeLater和invokeAndWait方法,以便在事件调度线程中执行该调用程序。(From Core Java)
相关文章推荐
- Liferay 启动过程分析12-处理全局启动事件
- Java学习过程中出现的异常问题与处理(最近更新20170915)
- 事件与事件处理过程的动态绑定 addhandler addressof
- QT中的界面跳转,事件处理过程思考
- Android事件处理过程,InputDispatchThread和InputReaderThread的协作,(3)
- Netty源码学习-ServerBootstrap启动及事件处理过程
- iOS 事件处理机制与图像渲染过程
- iOS 事件处理机制与图像渲染过程
- iOS 事件处理机制与图像渲染过程
- Android系统之事件处理子系统启动过程的学习和分析
- vb事件处理过程内部结构
- C#处理事件的过程
- Global.asax的16个事件处理过程
- 事件传递/处理过程
- 博为峰Java技术文章 ——JavaSE Swing 事件处理的过程与步骤
- ble协议栈cc2540x-1.3.2之通过key处理过程看任务、事件、消息机制
- 事件1058处理过程,处理组策略失败.
- 触摸事件处理的详细过程
- QT类 Qevent事件处理过程 事件过滤器
- Cordova 热更新处理(二):在 IOS 调试过程