精彩 Java 2 程式設計 C2 物件與事件控制技巧. 2 目錄 C2-1 認識事件 C2-1...
-
date post
22-Dec-2015 -
Category
Documents
-
view
261 -
download
4
Transcript of 精彩 Java 2 程式設計 C2 物件與事件控制技巧. 2 目錄 C2-1 認識事件 C2-1...
Java 2 < >精彩 程式設計 吳逸賢、吳目誠 編著
C2 物件與事件控制技巧
2
目錄
C2-1 認識事件 C2-2 以時間事件來控制物件 C2-3 滑鼠控制技巧 C2-4 鍵盤控制技巧
3
C2-1 認識事件
改寫視窗程式的架構 事件與事件傾聽者 事件類別 事件傾聽者 視窗事件
4
改寫視窗程式的架構:
在開始介紹事件的觀念之前,希望能先引導讀者改變程式的架構(因為這一章之前的程式碼架構,與這一章之後的程式架構不一樣)。
5
在 main() 程式中建立一個 frame 物件,然後設定frame 物件屬性的程式碼如下:
若將新撰寫的程式類別繼承 JFrame ,而在 main() 視窗中使用所建立的程式類別來建立程式物件,則這個物件便具有 JFrame 的特性,因此在程式中,就可以直接使用繼承自 JFrame 的方法和屬性,或者實作介面。
6
直接使用繼承自 JFrame 的方法和屬性的程式架構如下:
7
事件與事件傾聽者:
所謂事件( Event )是指軟體在執行的過程中,所可能發生的情況。
事件( Event )是物件導向程式非常重要的機制,是建立程式和使用者間溝通的橋樑。
在程式執行過程中,發生啟動程式、結束程式、按下滑鼠鍵、放開滑鼠鍵、按下鍵盤、打開視窗及關閉視窗等事件時,程式就可以根據發生的事件內容,執行特定的程式碼。
8
事件的發生與處理:
Java 的事件處理是一種委託式( delegation )事件處理模式,事件的發生與處理,是由事件類別( Event Class )產生的物件( Event Object )與事件傾聽者( Event Listener )所構成,其關係如下圖所示:
9
事件作業過程如下:
當我們移動滑鼠指標在按鈕(事件來源)上按一下滑鼠鍵時,按鈕會送出一個物件給 Action 事件傾聽者( ActionListener )。
ActionListener 事件傾聽者收到委託的物件後,便會啟動 actionPerformed() 方法,執行指定的工作。
10
物件與處理事件的方法:
在程式中要使用事件傾聽者 ActionListener ,必須實作( implements ) ActionListener 。
按鈕物件要委託 ActionListener 處理事件,要使用 add ActionListener() 方法。
11
按鈕物件委託 ActionListener 處理事件的程式碼如下:
12
13
程式執行結果如下:
14
事件類別:
Java 的事件類別大多數繼承自 java.awt.AWTEvent 類別。
15
繼承關係如下圖所示:
16
事件類別名稱的功能與產生時機說明如下:
17
其他同樣繼承自 EventObject 類別的事件類別:
其他同樣繼承自 EventObject 類別的事件類別,包括 CaretEvent 、 ChangeEvent 、 HyperlinkEvent 、 LineEvent 、 ListDataEvent 、ListSelectionEvent 、 MenuEvent 、 PopupMenuEvent 、 TableColumnModelEvent 、 TableModelEvent 、 TreeExpansionEvent 、 TreeModelEvent 、 TreeSelectionEvent 、 UndoableEditEvent 等等,這些事件類別都存放在 javax.swing.event 程式套件中。
18
事件的特性:
根據事件的特性,可分為低階事件( low-level events ) 與語意事件( semantic events )兩種。
低階事件類別包括 ComponentEvent 、 ContainerEvent 、 FocusEvent 、 KeyEvent 、 MouseEvent 、 PaintEvent 、 WindowEvent 等。
語意事件類別包括 ActionEvent 、 AdjustmentEvent 、ItemEvent 、 TextEvent 、 HierarchyEvent 、 InputMethodEvent 、 InvocationEvent 等。
一般來說,由視窗系統所產生,或滑鼠、鍵盤等產生的事件為低階事件,此外則為語意事件。
19
事件傾聽者:
EventListener (事件傾聽者)是一個介面( interface ,請參考 B2 ), EventListener是所有事件傾聽者介面的上層介面。
20
EventListener 包含下列子介面 -1 :
ActionListener ‘ 接收 ActionEvent AdjustmentListener ‘ 接收 AdjustmentEvent ComponentListener ‘ 接收 ComponentEvent ContainerListener ‘ 接收 ContainerEvent FocusListener ‘ 接收 FocusEvent HierarchyListener ‘ 接收 HierarchyEvent HyperlinkListener ‘ 接收 HyperlinkEvent InputMethodListener ‘ 接收 InputMethodEvent ItemListener ‘ 接收 ItemEvent KeyListener ‘ 接收 KeyEvent
21
EventListener 包含下列子介面 -2 :
ListDataListener ‘ 接收 ListDataEvent ListSelectionListener ‘ 接收 ListSelectionEvent MenuListener ‘ 接收 MenuEvent MouseListener ‘ 接收 MouseEvent MouseMotionListener ‘ 接收 MouseEvent MouseWheelListener ‘ 接收 MouseEvent PopupMenuListener ‘ 接收 PopupMenuEvent TableColumnModelListener ‘ 接收 TableColumn
ModelEvent TableModelListener ‘ 接收 TableModelEvent TextListener ‘ 接收 TextEvent
22
EventListener 包含下列子介面 -3 :
TreeExpansionListener ‘ 接收 TreeExpansionEvent TreeModelListener‘ 接收 TreeModelEvent TreeSelectionListener ‘ 接收 TreeSelectionEvent UndoableEditListener ‘ 接收 UndoableEditEvent WindowFocusListener ‘ 接收 WindowEvent WindowListener ‘ 接收 WindowEvent WindowStateListener ‘ 接收 WindowEvent
23
事件聽者數到事件時的執行方法:
當事件傾聽者收到事件時,會分別執行不同的方法。
例如 ActionListener 傾聽者介面會執行 actionPerformed() 方法,因此在程式中就要實作actionPerformed() 方法,而使用 KeyListener傾聽者介面,則程式中就要實作 keyPressed() 、 keyReleased() 和 keyTyped() 等方法。
24
視窗事件:
使用 WindowListener (視窗事件傾聽者)來接收視窗事件,必須實作下列七個方法:windowActivated() ‘ 視窗作用中windowDeactivated() ‘ 視窗沒有作用windowOpened() ‘ 視窗已經開啟windowClosed() ‘ 視窗已經關閉windowClosing() ‘ 關閉視窗中windowIconified() ‘ 最小化視窗windowDeiconified() ‘ 取消最小化視窗
25
前面章節中,有許多程式中都是利用下列程式碼來關閉視窗,並結束程式:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
26
使用 WindowListener 來接收關閉視窗的事件,進而結束視窗程式,程式碼如下:
27
28
29
執行程式畫面顯示如下:
30
透過 WindowAdapter 類別來關閉視窗,程式碼如下:
31
執行程式,選擇關閉視窗鈕就可以直接關閉視窗程式,畫面顯示如下:
32
C2-2 以時間事件來控制物件
利用時間事件變化來移動物件 同時控制多個不同移動速度的元件 應用三角函數製作圓形運動 畫面上彈跳的小球
33
利用時間事件變化來移動物件:
時間事件可以用來控制視窗上元件的變化,例如製作出元件緩緩上升的效果,畫面顯示如下:
34
時間事件:
時間事件的時間單位為千分之一秒,若設定為 500 ,則每 1/2 秒觸發一次。
35
以下就是製作氣球元件緩緩上升效果的程式碼:
36
37
38
同時控制多個不同移動速度的元件:
同時要控制多個不同移動速度的元件有兩種方法。
一種是使用一個時間物件,然後設定各元件不同的移動間隔;另一種是每一個元件分別對應一個時間物件,而分別設定不同的時間間隔。
39
控制多個不同移動速度的畫面顯示如下:
40
以下就是同時控制多個不同移動速度元件的程式碼:
41
42
應用三角函數製作圓形運動:
應用內建的三角函數,包括 sin 、 cos 、 tan 、atan…… 等等,可以應用這些函數來計算座標的位置。
例如:圓形運動、拋物線運動等軌道座標計算。
43
以下就是圓形軌道運動的執行畫面:
44
以下就是應用三角函數計算圓形軌道的程式碼:
45
46
47
畫面上彈跳的小球:
應用座標變化,可以製作出圖形彈跳的效果。
48
以下就是製作彈跳效果的程式碼:
49
50
51
執行程式,圖形就會有彈跳的效果:
52
C2-3 滑鼠控制技巧
滑鼠事件與事件傾聽者 顯示滑鼠座標位置 用滑鼠指標拉動佈景 簡易打地鼠程式 拖移物件與配對 座標位置記錄器
53
滑鼠事件與事件傾聽者:
MouseListener 和 MouseMotionListener 是負責接收滑鼠事件的傾聽者介面。
54
MouseListener 必須實作下列五個方法:
mousePressed(MouseEvent e) ‘ 按下滑鼠鍵mouseReleased(MouseEvent e) ‘ 放掉滑鼠鍵mouseEntered(MouseEvent e) ‘ 滑鼠進入按鍵區
mouseExited(MouseEvent e) ‘ 滑鼠離開按鍵區
mouseClicked(MouseEvent e) ‘ 按了一下滑鼠鍵
55
MouseMotionListener 則必須實作下列兩個方法:
mouseMoved(MouseEvent e) ‘ 移動滑鼠mouseDragged(MouseEvent e) ‘拖移滑鼠
56
下面就是 MouseListener 接收滑鼠事件的程式碼:
57
58
59
完成圖:
執行程式時,當滑鼠在按鍵上發生按下、放掉、進入、移開等事件時,視窗上會顯示事件的訊息。
60
下面就是 MouseMotionListener 接收滑鼠事件的程式碼:
61
62
執行程式,畫面顯示如下:
63
利用 InputEvent 事件判斷到底是按下左鍵還是右鍵 :
64
以下就是測試滑鼠按鍵的程式碼:
65
66
67
完成圖:
當滑鼠在滑鼠按鍵區按下滑鼠左鍵,視窗上方會顯示“按了一下左鍵的訊息”;當滑鼠在滑鼠按鍵區按下滑鼠右鍵,視窗上方會顯示“按了一下右鍵的訊息”。
68
滑鼠事件與事件傾聽者的注意事項:
使用 MouseListener 和 MouseMotionListener時,不論使用哪一個方法,都必須把其它沒有用到的方法輸入到程式中,否則,程式將無法執行。
69
顯示滑鼠座標位置:
在應用滑鼠事件來執行程式時,經常需要滑鼠的座標位置來輔助。
70
以下就是顯示滑鼠座標位置的程式碼:
71
72
完成圖:
在視窗中任意移動滑鼠,就會顯示滑鼠座標的位置。
73
用滑鼠指標拉動佈景:
佈景和滑鼠指標的互動,也是製作動態網頁經常使用到的技巧。
74
以下就是製作用滑鼠指標拉動佈景的程式碼:
75
76
77
完成圖:
78
簡易打地鼠程式:
這個例子的操作規則是畫面上會顯示小老鼠,操作者只要在小老鼠上按一下滑鼠左鍵,就可以得到 10 分。
79
以下就是設計簡易打地鼠程式的程式碼:
80
81
82
執行程式,畫面顯示如下:
83
拖移物件與配對:
使用滑鼠指標來拖移( drag )是經常使用到的控制技巧,以下這個例子將說明拖移物件和檢查位置等兩個技巧。
84
拖移物件和檢查位置的程式碼如下:
85
86
87
88
89
完成圖:
拖移水果到正確的位置,水果就會放在該處,若放錯,則會彈回到原來的位置。
90
座標位置記錄器:
設計軟體時,若需要找出畫面上的座標位置,可以設計一個簡單的程式來幫忙自動產生座標串列。
91
以下就是製作座標記錄器的程式碼:
92
93
94
完成圖:
拖移紅色圓形物件到想要記錄座標的位置,然後按一下滑鼠左鍵,就會將座標位置記錄在下方的文字方塊區內。
95
C2-4 鍵盤控制技巧
鍵盤事件傾聽者與 按鍵值 使用 Enter 鍵輸入答案利用鍵盤按鍵拉動佈景 模擬鍵盤按鍵狀態
96
鍵盤事件傾聽者與按鍵值:
KeyListener 是負責接收鍵盤事件的傾聽者介面, KeyListener 必須實作( implements )下列三個方法:keyPressed(KeyEvent evt) ‘ 按下按鍵keyTyped(KeyEvent evt) ‘ 按一下按鍵keyReleased(KeyEvent evt) ‘ 放掉按鍵
97
英文字母與數字鍵:
98
99
數字板( Keypad ):
100
功能鍵:
101
其它按鍵:
102
使用 Enter 鍵輸入答案:
使用 JTextField 物件,可以讓使用者直接輸入資料,不過無法直接按 鍵,而下面這個例子就可以在按 鍵後開始檢查答案。
103
以下就是使用 鍵來輸入答案的程式碼:
104
105
106
107
108
完成圖:
完成後執行程式,依顯示的加法題目,在鍵盤上輸入答案,然後按下鍵盤上的 鈕,確認答案,就會出現答對了或答錯了的回饋畫面。
109
利用鍵盤按鍵拉動佈景:
前一節曾經介紹使用滑鼠指標來拉動佈景的技巧,當然,利用鍵盤按鍵也可以拉動佈景。
110
以下就是利用鍵盤按鍵拉動佈景的程式碼:
111
112
113
完成圖:
在鍵盤上按下 或 鍵,佈景就會被拉動了!
114
模擬鍵盤按鍵狀態:
所謂模擬鍵盤按鍵狀態,是指在螢幕上顯示鍵盤上的按鍵為按下的狀態,或放掉的狀態,例如當同時按下鍵盤上的 A 、 B 鍵時,畫面上的 A 、 B 鍵會呈現被按下的狀態。
115
以下就是製作模擬鍵盤按鍵狀態互動程式的程式碼:
116
117
118