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事件里有处理代码。那么当按钮弹起来的时候,你就会知道,处理代码执行过了。当然也会相互影响,比如,你的代码运行时间很长,你就会看到该按钮很长时间不能弹起来,并且整个这段时间整个窗体其它部件也不再对任何输入作出响应。 有些情况下,二者的联系不是很密切,你希望部件能够立即显示或重画,而处理代码在后台运行,那么你就可以使用invokeLater 。invokeLater实际上就是把处理代码放到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方法都会得到调用.