![](https://csdnimg.cn/release/download_crawler_static/4932349/bg3.jpg)
Event-Source |负责接收 Events,再 dispatch 到已经注册过的 listener objects。
|所以基本上 Event Source 必须具备注册的功能(by addXXXListener)
Event-Listener |负责实作出对应之 Event Handlers。必须 implements java.awt.event
|package 中的 Listener interface。
*Event 从何而来? 往那里去?
聪明的读者们,相信你们第一次使用 Java 写 GUI 程序时,一定跟笔者同样有个疑问,那就
是 Java 的 Event 究竟从何而来?毕竟,事件驱动是 GUI 程序的基本精神之一,然而却由于
Java 本身是直译式(interpret) 语言,大部分 Java 语言底层的介面都交由 Java 虚拟机器
(Virtual Machine)这个幕后的大黑手来处理,所以我们从 Java 的 Program(.java) 中,看不
到任何像传统写 Window 程序(EX:Win32 SDK)所必须去 handle 的 Message Loop。当然 这
对 Programmer 而言是件好事(因为复杂度减少),但是追根究底,Java GUI 程序的底层,
还是会有个 Message Loop ,从 System Queue 或 Application Queue 中捕捉 Message,并 一
路包装到 Java 这一层来处理。而这就是本篇文章所要探讨的主题之一。
我们知道在 Win32 系统中,当我们执行某个 Application(GUI 程序),系统背后会提供这个
Application
可以使用的 System/Application Queue ,程序会不断到这些 Queue 来
GetMessage(不管是系统或是其他应用程序送过来的信息),若发现信息,就处理之;若没有
信息,则把控制权交还给系统。那 Java 呢? Java 的 Event Model 是不是也有类似的机制呢?
答案是肯定的!
由于 java.awt.event 这个 package 位在 java.awt 的下一层目录,所以我们直接到 JDK(必须
1.1 以上的版本,笔者采用的版本为 JDK1.1.6)所附的 Class Library Source 中的 java/awt
这个目录去瞧瞧,果然,我们看到了一个叫做 EventQueue 的类别,从这个类别中我们发现
了两个 Key Points:
1.EventQueue 中有个"queue"的私有资料成员,其宣告如下:
private EventQueueItem queue;
再来我们看看 EventQueueItem 的类别定义:
class EventQueueItem {
AWTEvent event;
int id;
EventQueueItem next;
EventQueueItem(AWTEvent evt) {
event = evt;
id = evt.getID();
}
}
EventQueueItem 中的 event 跟 id 不就是 Java Event Model 中,所有 Event 类别最基本且最
必要的资料吗!而 EventQueue 中的 queue 则是用来存放所有被丢到 Java EventQueue 的