关于事件派遣线程

时间:2013-06-27 15:32:56

标签: java event-dispatch-thread

我正在阅读一些关于java中的事件调度线程的文章。因为它意味着GUI的创建,GUI组件的所有事件都应该在这个线程中执行。如果看一下在创建JFrame时在net beans IDE上生成的一些代码,我可以同意这个评论的一部分。因为它包含一些将GUI创建指向EDT的代码,如 java.awt.EventQueue.invokeLater(new Runnable().. ...

Ex:
public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Temp().setVisible(true);
        }
    });
}

但是我们在事件处理方法上编写的表达式没有那种指示语句。

Ex
private void btnTodayActionPerformed(java.awt.event.ActionEvent evt) {                                         
    xxxxxxxxxxxxxxxxx ;
    xxxxxxxxxxxxxxxxxxxxxxxxxxx;
} 

那是哪里?还是由编译器完成? 请善待我帮助..这将是一个愚蠢的问题...

2 个答案:

答案 0 :(得分:1)

顾名思义,所有UI事件(包括点击事件)都是在事件派遣线程中引发的。

事件调度线程实际执行的操作是运行操作系统级别的消息循环以通知UI事件,然后将这些事件分派给相应的Swing组件。

答案 1 :(得分:0)

事件总是在EDT上引发,因此您为回调编写的任何代码也在EDT上,当您已经使用不同的线程时,您只需要invokeLater(或类似)(例如,长任务不应该是在EDT上执行,因为它们冻结整个接口,而不是它们应该在自己的线程上执行,并定期使用invokeLater来更新接口)