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