第十八章事件處理 認識 Java 的委派事件模式認識並學習使用各種事件處理學習各種物件的事件處理 1
18.1 委派事件模式 委派事件 指當事件發生時, 產生事件的物件會把 訊息 轉給 事件傾聽者 (event listener) 處理 下圖說明 委派事件模式 的運作流程 : 2
簡單的範例 18.1 委派事件模式 視窗內加入按鈕, 尚未加入事件的處理之程式 : 視窗內有一按鈕, 當此按鈕按下時, 視窗的顏色會有變化, 下圖說明此範例的執行流程 3
18.1 委派事件模式 傾聽者與註冊 傾聽者通常會讓包含 事件來源者 的物件來擔任 我們不能把 app18_1 的第 5 行撰寫成下面的敘述, 又讓 frm 充當傾聽者 : 按鈕觸發事件由 ActionListener 介面傾聽, 第 3 行修改成 : 決定事件來源者與傾聽者後, 接著向事件來源者註冊 : 4
18.1 委派事件模式 撰寫事件處理的程式碼 本例的事件處理是把視窗的底色改成黃色, 因此可以撰寫出如下的程式 : actionperformed() method 會接收 ActionEvent 型態的物件, 正是按鈕按下後傳過來的物件 由於會用到 ActionEvent, 必須載入包含此的庫 : 5
18.1 委派事件模式 最後的完成工作 (1/2) 重新整理, 可得到下面的程式碼 : 6
18.1 委派事件模式 最後的完成工作 (2/2) app18_2 的執行流程 : 7
18.1 委派事件模式 內部當成傾聽者 下面的程式是定義內部後, 將它當成傾聽者 : 宣告成 static 是因為在外部的 函數 內, 不能建立內部物件 8
18.2 認識事件處理 事件 AWTEvent 是所有事件的最上層 下圖為事件的繼承關係圖 : 事件大致分為兩種 : 語意事件 (semantic events) 低階事件 (low-level events) 9
事件傾聽者的繼承關係 18.2 認識事件處理 下圖顯示出事件傾聽者之間的繼承關係 : 10
18.2 認識事件處理 事件與傾聽者的 method 事件 事件傾聽者介面與傾聽者介面裡所提供的 method 11
18.2 認識事件處理 可能觸發的事件整理 物件與可能觸發事件的對應關係, 整理成下表 : 某些物件可能會觸發多個事件, 只需針對所要的事件撰寫程式碼 12
18.3 使用 ActionEvent 觸發動作事件 觸發事件的物件把 ActionEvent 的物件傳送給向它註冊的傾聽者, 請它負責處理 getsource() method 可傳回事件來源物件 getmodifiers() method 可取得事件發生時所按下的按鍵 按鍵被按下的常數定義在 InputEvent, 列表如下 : 13
加入關閉視窗的按鈕 (1/2) app18_4 是 ActionEvent 的使用範例 18.3 使用 ActionEvent 14
加入關閉視窗的按鈕 (2/2) 18.3 使用 ActionEvent getsource() 可能會傳回其父的物件, 因此必須先將它強制型態轉換成 Button exit(0) 代表正常結束, 其它整數代表非正常結束 15
18.4 使用 ItemEvent ItemEvent 的成員 視窗中的選項物件被選取時, 會觸發 選項事件 ItemEvent 事件的傾聽者須實作 ItemListener 介面, 該介面定義 itemstatechanged() method: ItemEvent 提供一些成員列表如下 : 16
18.4 使用 ItemEvent 選項事件的範例 (1/2) app18_5 的物件配置圖與程式碼如下所示 : 物件配置圖 執行結果 17
18.4 使用 ItemEvent 選項事件的範例 (2/2) 物件配置圖 執行結果 18
18.5 文字事件的處理 --TextEvent 文字事件 文字事件 (text event) 當 TextField 或 TextArea 物件裡的文字改變時所觸發的事件 TextEvent 處理文字事件 TextListener 為傾聽 TextEvent 事件的介面 TextListener 介面定義 textvaluechanged() method: 19
文字事件的範例 18.5 18.5 文字事件的處理 --TextEvent TextEvent 的使用範例 物件配置圖 在左邊的 TextArea 中輸入文字, 右邊的 TextArea 會跟著顯示相同的文字 20
按鍵事件 18.6 按鍵事件的處理 --KeyEvent 按鍵事件 (KeyEvent class) 繼承自 InputEvent 屬於低階層的事件 下表列出 KeyEvent 常用的 method: KeyEvent 事件須實作 KeyListener 介面來當成傾聽者 KeyListener 介面的事件處理 method keypressed() keyreleased() keytyped() 21
18.6 按鍵事件的處理 --KeyEvent 事件轉接器 事件轉接器 (adapter) 內定義的是 " 空的 " method 只須針對相關的事件處理撰寫程式碼 處理 KeyEvent 事件的有 2 種 KeyListener 介面 KeyAdapter 22
KeyListener 介面 18.6 按鍵事件的處理 --KeyEvent 須以實作 KeyListener 介面 KeyListener 介面裡宣告三個 method, 列表如下 : 23
18.6 按鍵事件的處理 --KeyEvent KeyEvent 使用的範例 (1/2) app18_7 的物件配置與程式碼如下所示 : 物件配置圖 執行結果 24
18.6 按鍵事件的處理 --KeyEvent KeyEvent 使用的範例 (2/2) 物件配置圖 執行結果 25
KeyAdapter 事件 KeyAdapter 18.6 按鍵事件的處理 --KeyEvent 事實上是 " 空的 ", 也就是沒有任何敘述的 method 實作 KeyListener 介面 若只針對 keypressed() 事件撰寫程式碼, 此時的 keypressed() 即利用 改寫 (overriding) 的技術, 覆蓋定義於 KeyAdapter 裡空的 keypressed() method 26
KeyAdapter 的範例 18.6 按鍵事件的處理 --KeyEvent 以 KeyAdapter 事件處理 KeyEvent 事件的範例 先產生 KeyLis 的物件, 再把它當成是 txf 的事件傾聽者 必須宣告成 static 才能被 main() method 存取 某些按鍵如 Shift Ctrl 與 Alt 等, 並沒有被歸類為 Action key, 但又不屬於可列印字元, 諸如此類的按鍵會以 來顯示 取得鍵入的字元 27
滑鼠事件的 method 18.7 滑鼠事件的處理 --MouseEvent 滑鼠事件 (MouseEvent class) 繼承自 InputEvent 觸發滑鼠事件的動作 滑鼠的按鈕按下 滑鼠指標進入或移出事件來源物件 移動 拖曳滑鼠等 下表是 MouseEvent 裡常用的 method: 28
MouseListener 介面 滑鼠事件的傾聽者 MouseListener 介面 MouseMotionListener 介面 18.7 滑鼠事件的處理 --MouseEvent MouseListener 介面主要傾聽下列 5 項事件 : 按一下滑鼠按鈕 ( 包括滑鼠左鍵或右鍵 ) 滑鼠的指標移到事件的來源物件 ( 如按鈕 ) 的上方 滑鼠的指標從事件的來源物件 ( 如按鈕 ) 的上方移出 按下滑鼠的任一個按鍵 放開滑鼠被按下的按鍵 29
18.7 滑鼠事件的處理 --MouseEvent MouseListener 介面的 method MouseListener 介面裡定義的 method: 30
18.7 滑鼠事件的處理 --MouseEvent MouseMotionListener 介面 MouseMotionListener 介面用來傾聽下列事件的發生 : 當滑鼠在事件的來源物件上方移動 (move) 時 當滑鼠在事件的來源物件上方拖曳 (drag) 時 MouseMotionListener 介面裡定義的 method: 滑鼠事件的處理可利用 MouseAdapter MouseMotionAdapter 31
18.7 滑鼠事件的處理 --MouseEvent 使用 MouseListener 介面 (1/2) app18_9 的物件配置與程式碼如下所示 : 物件配置圖 執行結果 32
18.7 滑鼠事件的處理 --MouseEvent 使用 MouseListener 介面 (2/2) 物件配置圖 執行結果 33
MouseMotionListener 介面 (1/2) MouseMotionListener 介面用來傾聽的事件 滑鼠移動 拖曳 18.7 滑鼠事件的處理 --MouseEvent 利用 addmousemotionlistener() method 註冊事件傾聽者 app18_10 是 MouseMotionListener 介面使用的範例 當滑鼠拖曳或移動時, 此處便會顯示出滑鼠指標的座標 34
18.7 滑鼠事件的處理 --MouseEvent MouseMotionListener 介面 (2/2) 當滑鼠拖曳或移動時, 此處便會顯示出滑鼠指標的座標 35
MouseAdapter 18.7 滑鼠事件的處理 --MouseEvent 以 MouseAdapter 事件處理 MouseEvent 事件的範例 必須宣告成 static 才能被 main() method 存取 36
18.7 滑鼠事件的處理 --MouseEvent 使用 MouseMotionAdapter MouseMotionAdapter 已實作 MouseMotionListener 介面 處理 MouseEvent 的事件的步驟 以繼承 MouseMotionAdapter 的方式建立新 再以此的物件當成傾聽者 37
WindowEvent 的 method 視窗事件 (WindowEvent class) 屬於低階的事件 觸發視窗事件的動作 視窗的建立 視窗縮小至工具列 關閉視窗 18.8 視窗事件的處理 --WindowEvent WindowEvent 提供的 method: 38
18.8 視窗事件的處理 --WindowEvent WindowListener 介面的 method 下表列出 WindowListener 介面定義的 method: 39
18.8 視窗事件的處理 --WindowEvent 使用 WindowAdapter (1/2) app18_12 以 WindowAdapter 來處理視窗事件 執行結果會因觸發視窗事件而定 此處也可使用 System.exit(0); 以此方式關閉視窗, 資源不會被釋放 40
18.8 視窗事件的處理 --WindowEvent 使用 WindowAdapter (2/2) 執行結果會因觸發視窗事件而定 41