Java swing(awt):事件監聽機制的實現原理+簡單示例

(1)實現原理

事件監聽機制的實現:
參考圖:事件模型_ActionEvent
  爲了節省資源,系統沒法對某個事件進行實時的監聽。故實現的機制是當發生某個事件後,處理代碼將被自動運行,相似鉤子通常。(回調函數)事件有許多,這邊以按鈕被按下爲例。因爲處理的方法函數是咱們人爲進行編寫的,故Button是不知道所要調用的函數名是什麼。對此採用的解決方法爲:
Button源代碼調中用接口方法,而咱們的監聽處理函數則必需要實現該接口(ActionListener)
這樣利用多態,使得Button雖調用的爲該接口的方法,但運行的則是咱們new出來的對象方法。相似於Button提供了這麼一個鉤子,可是鉤子上面是什麼東西他本身並不清楚,咱們只須要人爲地往上面掛上咱們須要的東西便可。

事件監聽機制實現過程(以下圖): 當事件源對象發生了某一事件後,事件信息將被打包爲ActionEvent類,併發送給事件監聽器。然後事件監聽器將根據其內容(包括鼠標點擊的位置,動做等)作出相應的處理。(自動執行actionPerformed()函數) 而實現了特定接口的事件監聽器爲了對事件源對象的某一特定事件進行監測,所以必須進行註冊。即告知事件源對象已被監聽(b.addActionListener(m))
 



(2)事件監聽示例1java

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. /* 
  2.  * 事件監聽的四步: 
  3.  * 1.要有事件源對象:button 
  4.  * 2.要發生某種事件(類):ActionEvent,封裝了事件的信息 
  5.  * 3.要有監聽器(接口):Monitor  接到事件後進行處理 
  6.  * 4.要把監聽器註冊到事件源對象上 b.addActionListener(mo); 
  7.  * 事件與監聽器一一對應 
  8.  * 取決也事件源對象能添加哪一種事件(註冊哪一種事件) 
  9.  */  
  10. import java.awt.BorderLayout;  
  11. import java.awt.Button;  
  12. import java.awt.Frame;  
  13. import java.awt.event.ActionEvent;  
  14. import java.awt.event.ActionListener;  
  15.   
  16. public class TestActionEvent {  
  17.   
  18.     public static void main(String[] args) {  
  19.         Frame f = new Frame("Test");  
  20.         Button b = new Button("Press me");  
  21.         Monitor mo = new Monitor();  
  22.         b.addActionListener(mo);  
  23.         f.add(b, BorderLayout.CENTER);  
  24.         f.pack();  
  25.         f.setVisible(true);  
  26.     }  
  27.   
  28. }  
  29.   
  30. class Monitor implements ActionListener {  
  31.   
  32.     @Override  
  33.     public void actionPerformed(ActionEvent e) {  
  34.         System.out.println("a button has been pressed");  
  35.     }  
  36.   
相關文章
相關標籤/搜索