事件監聽機制的實現:
參考圖:事件模型_ActionEvent
爲了節省資源,系統沒法對某個事件進行實時的監聽。故實現的機制是當發生某個事件後,處理代碼將被自動運行,相似鉤子通常。(回調函數)
事件有許多,這邊以按鈕被按下爲例。因爲處理的方法函數是咱們人爲進行編寫的,故Button是不知道所要調用的函數名是什麼。
對此採用的解決方法爲:Button源代碼調中用接口方法,而咱們的監聽處理函數則必需要實現該接口(ActionListener)
這樣利用多態,使得Button雖調用的爲該接口的方法,但運行的則是咱們new出來的對象方法。
相似於Button提供了這麼一個鉤子,可是鉤子上面是什麼東西他本身並不清楚,咱們只須要人爲地往上面掛上咱們須要的東西便可。
當事件源對象發生了某一事件後,事件信息將被打包爲ActionEvent類,併發送給事件監聽器。然後事件監聽器將根據其內容(包括鼠標點擊的位置,動做等)作出相應的處理。(自動執行actionPerformed()函數)
而實現了特定接口的事件監聽器爲了對事件源對象的某一特定事件進行監測必須進行註冊。即告知事件源對象已被監聽(b.addActionListener(m))
如下爲示例代碼:
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");
Monitor m = new Monitor();
b1.addActionListener(m);
b2.addActionListener(m); // 註冊,告知事件源對象被m監聽器所監聽
b2.setActionCommand("GAME OVER!");
f.add(b1, BorderLayout.NORTH);
f.add(b2, BorderLayout.SOUTH);
f.pack(); // 根據內容肯定Frame邊框大小,相似外圍包裝上一層
f.setVisible(true);
}
}
class Monitor implements ActionListener {
public void actionPerformed(ActionEvent e) { // 事件信息被打包在了ActionEvent e中傳遞過來,等待處理
System.out.println("A Button has been pressed!\n" +
"the relative info is:" + e.getActionCommand()); // ActionCommand中默認信息爲該Button的名字
}
}