Java SwingUtilities.invokeLater(new Runnable(){})方法详解

SwingUtilities.invokeLater():

  • invokeLater一般用于在线程里修改swing组件的外观,因为swing组件是非同步的,所以不能在线程中直接修改,会不同步,得不到期望的效果,所以要把修改外观的代码放在一个单独的线程中,交给invokeLater:后面的程序(线程中的重写的run()方法及run()方法中的代码)和这个参数的线程(new Runnable())对象可以并行,异步地执行
import javax.swing.SwingUtilities;

public class Explorer {//资源管理器
		public static void main(String args[]){
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					new MainFrame();//创建主机
				}
			});//等SwingUtilities.invokeLater()图形用户接口全部实现后,才能调用匿名内部类的线程,从而实现异步执行
		}
}
  • 这样做的目的是为了使部件的外观与其事件处理能够协调。比如,你点击一个按钮,并且在该按钮的onClick事件里有处理代码。那么当按钮弹起来的时候,你就会知道,处理代码执行过了。当然也会相互影响,比如,你的代码运行时间很长,你就会看到该按钮很长时间不能弹起来,并且整个这段时间整个窗体其它部件也不再对任何输入作出响应。
  • 有些情况下,二者的联系不是很密切,你希望部件能够立即显示或重画,而处理代码在后台运行,那么你就可以使用invokeLaterinvokeLater实际上就是把处理代码放到Event-Dispatch线程之外的线程中运行,而部件可以立即执行重画操作。

Event Dispatch Thread(事件分发线程):

  • AWT库实现了监控GUI交互的线程.这个线程实际上就是循环检查系统事件队列(System Event Queue)是否有鼠标点击,键盘按下或其他系统事件,这个线程就是事件分发线程(Event Dispatch Thread),它是java.awt.EventDispatchThread的一个实例 .
  • 事件分发线程是Swing和AWT中最重要的,在绘制,更新和显示组件和受控的应用程序方面扮演着关键的角色.
  • 和这个线程紧密相关的是一个FIFO事件的队列----系统事件队列,它是java.awt.EventQueue的一个实例.每个事件都是按顺序一个一个的执行的,这是为了避免在组件重绘的过程中组件的状态发生变化.我们一定要小心不要再事件分发线程之外分发一个事件.另外,应当尽量使事件句柄和绘制方法尽可能的短小精悍,否则系统的反应会变得不灵敏,有些时候甚至看起来像是死机. 
  • 事件分发线程(Event Dispatch Thread)从系统事件队列取出并检测对其采取何种处理.如果是对一个组件的点击,就为这个组件调用处理句柄.接下来,那个组件再发送其他事件.例如,假设你单击了一个JButton,事件分发线程传递一个鼠标单击到JButton, JButton把它解释成一个"按钮按下",并调用它的actionPerformed 方法.所有注册过的监听器的actionPerformed方法都会得到调用. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值