現在使用的仍是AWT的事件模型。涉及到3類對象: Event Source:事件源,即事件發生所在的組件 Event:事件,封裝了此次事件的相關信息 Event Listener:事件監聽器,監聽事件,發生指定事件時自動調用對應的方法 監聽器可以繼承介面自己寫代碼實現,也可以繼承適配器(空實現),然 ...
現在使用的仍是AWT的事件模型。涉及到3類對象:
- Event Source:事件源,即事件發生所在的組件
- Event:事件,封裝了此次事件的相關信息
- Event Listener:事件監聽器,監聽事件,發生指定事件時自動調用對應的方法
監聽器可以繼承介面自己寫代碼實現,也可以繼承適配器(空實現),然後只重寫部分方法的實現。
事件可分為2類:
1、低級事件:基於具體的動作,包括
事件 | 觸發條件 | 監聽器 | 適配器 | 方法 |
KeyEvent 鍵盤事件 | 按下、鬆開、單擊鍵盤上的某個鍵時觸發 | KeyListener | KeyAdapter |
keyPressed:按下某個鍵時觸發 keyReleased:鬆開某個鍵時觸發 keyTyped:單擊某個鍵時觸發 |
MouseEvent 滑鼠事件 |
MouseListener
MouseMotionListener |
MouseAdapter
MouseMotionAdapter |
MouseListener的5個方法: mousePressed:按下某個滑鼠鍵時觸發 mouseReleased:鬆開某個滑鼠鍵時觸發 mouseClicked:單擊某個滑鼠鍵時觸發 mouseEntered:滑鼠移入該組件時觸發 mouseExited:滑鼠移出該組件時觸發
MouseMotionListener的2個方法: mouseMoved:在該組件上移動滑鼠時觸發 mouseDragged:在該組件上按下某個滑鼠鍵並移動滑鼠時觸發,如在畫布上畫圖 |
|
FocusEvent 焦點事件 | 獲得焦點、失去焦點時觸發 | FocusListener | FocusAdapter |
focusGained:獲取焦點時觸發 focusLost:失去焦點時觸發 |
WindowEvent 窗體事件 |
打開視窗、關閉視窗, 視窗最大化、最小化時觸發 |
WindowListener | WindowAdapter |
windowOpened:打開視窗時觸發 windowClosing:單擊右上角的“X”時觸發 windowClosed:調用dispose()釋放窗體資源時觸發
windowDeactivated:視窗失活(失去焦點)時觸發 windowDeiconified:視窗重新獲得焦點時觸發(恢復) windowActivated:視窗被激活(獲得焦點)時觸發,首次+恢復
windowIconified:視窗最小化時觸發 |
ContainerEvent 容器事件 | 往容器中添加、移除組件時觸發 | ContainerListener | ContainerAdapter |
componentAdded:往容器中添加組件時觸發 componentRemoved:從容器中移除組件時觸發 |
ComponentEvent 組件事件 |
組件的尺寸發生變化、 位置發生改變、 組件被隱藏/顯示時觸發 |
ComponentListener | ComponentAdapter |
componentResized:組件尺寸發生變化時觸發 componentMoved:組件的位置發生改變時觸發 componentHidden:組件被隱藏時觸發 componentShown:組件被顯示時觸發 |
PaintEvent 組件繪製事件 | 調用組件的paint()/update()來繪製時觸發 |
2、高級事件(語義事件),不和具體的動作關聯,只表示發生了該事件,包括:
事件 | 觸發條件 | 監聽器 | 適配器 | 方法 |
ActionEvent 動作事件 | 按鈕、菜單項、輸入框被單擊/手動Enter時觸發 | ActionListener | ActionAdapter | actionPerformed |
AdjustmentEvent 調節事件 | 移動滑塊調節數值值觸發 | AdjustmentListener | AdjustmentAdapter | adjustmentValueChanged |
ItemEvent | 選中、取消選中某項時觸發 | ItemListener | ItemAdapter | itemStateChanged |
TextEvent | 文本框、文本域中的文本發生改變時觸發 | TextListener | TextAdapter | textValueChanged |
以上介面中均只有一個抽象方法,若採用匿名內部實現,可使用lambda表達式。
給組件添加事件監聽:
component.addXxxListener(XxxListener/XxxAdapter listener);
實現監聽器的4種方式:
1、內部類形式實現
在此外部類中,可復用這個監聽器,可直接訪問外部類中所有的UI組件。
若外部類中有多個組件要使用此監聽器,可使用此種方式。
2、匿名內部類形式實現
簡便,適合只使用一次的監聽器。
3、外部類形式實現
監聽器屬於特定的GUI界面,使用外部類實現監聽器,不利於提高程式的內聚性。
且外部類形式的監聽器不能訪問其他類代表的GUI界面的組件。
但可以被多個類共用。
不推薦。
4、類本身作為監聽器(實現介面、繼承改寫適配器)
代碼混亂,可讀性下降,不推薦。
類代表的GUI界面主要負責顯示邏輯,儘量不要將業務邏輯直接寫在GUI類中,
可以將業務邏輯寫在單獨的類/介面中,然後在顯示邏輯中調用,降低了耦合,後期好維護。