java核心技術卷 之事件處理基礎

        任何支持GUI的操作環境都要不斷地監視按鍵或點擊鼠標這樣的亊件。操作環境將這些事件報吿給正在運行的應用程序。如果有事件產生,每個應用程序將決定如何對它們做出響應。在Visual Basic這樣的語言中,事件與代碼之間有着明確的對應關係。程序員對相關的特定事件編寫代碼,並將這些代碼放置在過程中,通常人們將它們稱爲事件過程(event procedure)。例如,有一個名爲HelpButton的Visual Basic按鈕有一個與之關聯的HelpButton_Click事件過程。這個過程中的代碼將在點擊按鈕後執行。每個Visual Basic的GUI組件都響應一個固定的事件集,不可能改變Visual Basic組件響應的事件集。

        另一方面,如果使用像原始的C這樣的語言進行事件驅動的程序設計,那就需要編寫代碼來不斷地檢査事件隊列,以便査詢操作環境報告的內容(通常這些代碼被放置在包含很多 switch語句的循環體中)。顯然,這種方式編寫的程序可讀性很差,而且在有些情況下,編碼的難度也非常大。它的好處在於響應的事件不受限制,而不像Visual Basic這樣的語言,將事件隊列對程序員隱藏起來。

        Java程序設計環境折中了 Visual Basic與原始C的事件處理方式,因此,它既有着強大的功能,又具有一定的複雜性。在AWT所知的事件範圍內,完全可以控制事件從事件源 (event source)例如,按鈕或滾動條,到事件監聽器(event listener)的傳遞過程,並將任何對象指派給事件監聽器。不過事實上,應該選擇一個能夠便於響應事件的對象。這種事件委託模型(event delegation model)與Visual Basic那種預定義監聽器模壞比較起來更加靈活。

        像Java這樣的面嚮對象語言,都將事件的相關息封裝在一個事件對象(event object) 中。在Java中,所有的事件對象都最終派生於java.util.EventObject類。當然,每個事件類型還有子類,例如,ActionEvent 和 WindowEvent。

        不同的事件源可以產生不同類別的事件。例如,按鈕可以發送一個ActionEvent對象, 而窗口可以發送WindowEvent對象。 

        綜上所述,下而給出AWT事件處理機制的概要:

        1、監聽器對象是一個實現/特定監聽器接口(listener interface)的類的實例。

        2、事件源是一個能夠註冊監聽器對象併發送事件對象的對象。 

        3、當事件發生時,事件源將事件對象傳遞給所有註冊的監聽器。
        4、監聽器對象將利用事件對象中的信息決定如何對事件做出響 

        圖顯示了事件處理類和接口之間的關係。


下面是監聽器的一個示例: 

ActionListener listener=...

JButton button = new ]Button(“ok”); 

button.addActionListener(listener);

         現在,只要按鈕產生了 —個“動作事件",istener對象就會得到通告。對於按鈕來說, 正像我們所想到的,動作事件就是點擊按鈕。 

         爲了實現ActionListener接口,監聽器類必須有一個被稱爲actionPerformed的方法,該 方法接收一個ActionEvent對象參數。

class MyListener iiplements ActionListener {

public void actionPerfoned(ActionEvent event) {

// reaction to button click goes here

}

}

        只要用戶點擊按鈕,JButton對象就會創建一個ActionEvent對象,然後調用listener.actionPerformed (event)傳遞事件對象可以將多個監聽器對象添加到一個像按鈕這樣的事件源中。這樣一來,只要用戶點擊按鈕,按鈕就會調用所有監聽器的actionPerfoned方法。 

        圖顯示了件源、事件監聽器和事件對象之間的協作關係。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章