事件監聽機制的實現:
參考圖:事件模型_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的名字 } }