(1)實現原理 事件監聽機制的實現: 參考圖:事件模型_ActionEvent
為了節省資源,系統無法對某個事件進行實時的監聽。故實現的機制是當發生某個事件后,處理代碼將被自動運行,類似鈎子一般。(回調函數)事件有許多,這邊以按鈕被按下為例。由於處理的方法函數是我們人為進行編寫的,故Button是不知道所要調用的函數名是什么。對此采用的解決方法為: Button源代碼調中用接口方法,而我們的監聽處理函數則必須要實現該接口(ActionListener) 這樣利用多態,使得Button雖調用的為該接口的方法,但運行的則是我們new出來的對象方法。類似於Button提供了這么一個鈎子,但是鈎子上面是什么東西他自己並不清楚,我們只需要人為地往上面掛上我們需要的東西即可。 事件監聽機制實現過程(如下圖): 當事件源對象發生了某一事件后,事件信息將被打包為ActionEvent類,並發送給事件監聽器。而后事件監聽器將根據其內容(包括鼠標點擊的位置,動作等)做出相應的處理。(自動執行actionPerformed()函數) 而實現了特定接口的事件監聽器為了對事件源對象的某一特定事件進行監測,因此必須進行注冊。即告知事件源對象已被監聽(b.addActionListener(m))
(2)事件監聽示例1
import java.awt.*; import java.awt.event.*; public class TestActionEvent { public static void main(String[] args) { Frame f = new Frame("TestActionEent"); Button b1 = new Button("START"); Button b2 = new Button("STOP"); //創建事件源對象b2 Monitor m = new Monitor(); //創建事件監聽器m b1.addActionListener(m); b2.addActionListener(m); // 將事件源對象b2注冊到事件監聽器m中,告知b2已被m所監聽 b2.setActionCommand("GAME OVER!"); f.add(b1, BorderLayout.NORTH); f.add(b2, BorderLayout.SOUTH); //將按鈕b2添加到面板f f.pack(); // 根據內容確定Frame邊框大小,類似外圍包裝上一層 f.setVisible(true); } } class Monitor implements ActionListener { //創建實現了事件監聽接口ActionListener的事件監聽器類Monitor public void actionPerformed(ActionEvent e) { // 事件信息被打包在了ActionEvent e中傳遞過來,等待處理。 //actionPerformed()方法就是具體的處理事件的方法。 System.out.println("A Button has been pressed!\n" + "the relative info is:" + e.getActionCommand()); // ActionCommand中默認信息為該Button的名字 } }
(3)事件監聽示例2
- /*
- * 事件監聽的四步:
- * 1.要有事件源對象:button
- * 2.要發生某種事件(類):ActionEvent,封裝了事件的信息
- * 3.要有監聽器(接口):Monitor 接到事件后進行處理
- * 4.要把監聽器注冊到事件源對象上 b.addActionListener(mo);
- * 事件與監聽器一一對應
- * 取決也事件源對象能添加哪種事件(注冊哪種事件)
- */
- import java.awt.BorderLayout;
- import java.awt.Button;
- import java.awt.Frame;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- public class TestActionEvent {
- public static void main(String[] args) {
- Frame f = new Frame("Test");
- Button b = new Button("Press me");
- Monitor mo = new Monitor();
- b.addActionListener(mo);
- f.add(b, BorderLayout.CENTER);
- f.pack();
- f.setVisible(true);
- }
- }
- class Monitor implements ActionListener {
- @Override
- public void actionPerformed(ActionEvent e) {
- System.out.println("a button has been pressed");
- }
- }