任何支持GUI的操作都會不斷地監視敲打鍵盤、單擊鼠標等事件,操作環境會把這些事件報告給正在運行的程序,程序會決定如何響應這些事件。
事件源擁有自己的方法,允許我們向其注冊事件監聽器。當事件源產生某個事件時,事件源會向注冊在那個事件上的所有事件監聽器對象發送通知。
在像Java這樣的面向對象語言中,關于事件的信息被封裝在一個事件對象中。所有的事件對象都是從Java.util.EventObject派生出來的。
AWT中事件處理機制的概覽:
- 一個監聽器對象是一個實現了專門的監聽器接口的類的實例。
- 一個事件源是一個能夠注冊監聽器對象并向它們發送事件對象的對象。
- 事件發生時,事件源會把事件對象發生給所有的注冊監聽器。
- 監聽器對象隨后會使用事件對象中的信息來決定對事件的反應。
對于ActionListener接口,它可用于多種情況:
- 當通過雙擊來選擇列表框的一項時。
- 當選擇一菜單項時。
- 當在文本域中按下ENTER鍵時。
- 對于Timer組件來說,當指定時間達到時。
使用ActionListener接口的方法在所有的情況下都一樣:actionPerformed方法(ActionListener接口中唯一的方法)只有一個參數,是一個ActionEvent類型的對象。該事件對象給出了所發生事件的詳細信息。
在Java中,類實現一個接口意味著它要實現該接口中所有方法。
每個具有不止一個方法的AWT監聽器接口都有一個實現其所有方法,但方法中什么也不做的適配器類。
一個想接收某一事件的類必須實現一個監聽器接口。這個類要在事件源中注冊自己,然后,接收所需的事件對象。并通過監聽器接口中的方法做出相應的處理。
AWT明確區分語義事件和底層事件。 語義事件是用于表達用戶動作(如“點擊按鈕”)的事件;底層事件是使這些成為可能的事件。類似地,調整滾動條是個語義事件,而拖動鼠標則是一個底層事件。
事件源是用戶界面組件、窗口和菜單。操作系統會把用戶的動作(如鼠標移動和擊鍵操作)通知給感興趣的事件源。事件源在一個事件對象中描述事件的特征。事件源還保持有一組監聽器——當事件發生時需要調用的對象。當事件發生時,事件源調用監聽器接口中的適當方法把事件信息傳遞給多個監聽器。事件源是通過把適當的事件對象傳遞給監聽器類的方法來實現這一點的。監聽器通過分析事件對象以找出關于這個事件更多的信息。
Swing包提供了一個非常有用的機制,用來封裝命令,并把它們連接到多個事件源。這種機制就是Action接口,一個動作是一個對象。它封裝了:
- 命令的說明(用字符串或可選圖標表示)。
- 執行命令需要的參數。
所有的AWT事件源都支持一種對應監聽器的多點傳遞模型。這意味著同一事件被傳遞到不止一個監聽器對象。
API不對向事件源注冊的一組監聽器傳遞事件的次序作任何保證。因此,不要編寫依賴傳遞次序的邏輯。
當操作環境響應用戶動作(如鼠標點擊)生成事件時,同操作環境通信的AWT部分會收到一個通知,并把它轉化為一個AWT事件。接著,AWT把這個事件添加到一個事件隊列中。AWT中把事件分派到監聽器的部分會:
- 從事件隊列中提取事件。
- 為事件定位監聽器對象。
- 為事件調用正確的監聽器過程。