Java監聽器的四種實現方法

2020-10-22 11:00:53

監聽器的四種實現方法

android監聽有4種實現方法,分別為:
自身類作為事件監聽器
外部類作為事件監聽器
匿名內部類作為事件監聽器
內部類作為事件監聽器

其中在大二學習Java的過程中,用的最多的是第三個「匿名內部類作為監聽器」

在學習監聽器之前,先回顧一下,

什麼是監聽器?

查了一下百度百科,他給的定義是:Java事件監聽器是由事件類和監聽介面組成,自定義一個事件前,必須提供一個事件的監聽介面以及一個事件類。JAVA中監聽介面是繼承java.util.EventListener的類,事件類繼承java.util.EventObject的類。
通俗來說就是:監聽器就是一個實現特定介面的普通java程式,這個程式專門用於監聽另一個java物件的方法呼叫或屬性改變,當被監聽物件發生上述事件後,監聽器某個方法將立即被執行。

為什麼我們要使用監聽器?

監聽器在Java中是非常重要的一種方法。在生活中也經常會用到。
監聽器可以用來檢測網站的線上人數,統計網站的存取量等等!

監聽器元件

監聽器涉及三個元件:事件源,事件物件,事件監聽器 當事件源發生某個動作的時候,它會呼叫事件監聽器的方法,並在呼叫事件監聽器方法的時候把事件物件傳遞進去。 我們在監聽器中就可以通過事件物件獲取得到事件源,從而對事件源進行操作!
(1)事件:使用者對元件的一個操作,稱之為一個事件
(2)事件源:發生事件的元件就是事件源
(3)事件監聽器(處理器):監聽並負責處理事件的方法

執行順序
1、給事件源註冊監聽器
2、元件接受外部作用,也就是事件被觸發
3、元件產生一個相應的事件物件,並把此物件傳遞給與之關聯的事件處理器
4、事件處理器啟動,並執行相關的程式碼來處理該事件。

Java事件處理機制:自身類作為事件監聽器

import javax.swing.*;  
import java.awt.*;  
import java.awt.event.*;  
  
lass ThisClassEvent extends JFrame implements ActionListener{   
    JButton btn;  
  
    public ThisClassEvent(){  
        super("Java事件監聽機制");  
        setLayout(new FlowLayout());  
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  
        btn=new JButton("點選");  
        btn.addActionListener(this);  
        getContentPane().add(btn);  
  
        setBounds(200,200,300,160);  
        setVisible(true);  
    }  
  
    /**************************************/  
    public void actionPerformed (ActionEvent e){  
        Container c=getContentPane();  
        c.setBackground(Color.red);  
    }  
    /**************************************/  
  
    public static void main(String args[]){  
        new ThisClassEvent();  
    }  
}   

外部類作為事件監聽器

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ActionListenerDemo {


	public static void main(String[] args) {
		
		JFrame f = new JFrame();			//建立表單
		JPanel p = new JPanel();			//建立面板
		JButton btn = new JButton("點我");	//建立一個按鈕
		
	//外部類的實現
		
		//建立監聽器ActionListener
		//new ActionListener();錯誤,介面不能new
		//建立實現子類InterfaceDemo
		InterfaceDemo a = new InterfaceDemo();
		//將監聽器InterfaceDemo繫結到btn按鈕上
		btn.addActionListener(a);
		
		p.add(btn);							//將按鈕新增到面板中
		f.add(p);							//將面板新增到表單中
		
		f.setSize(400,300);					//設定表單的大小
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設定關閉表單的後臺
		f.setVisible(true);					//設定表單可見
	}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


//事件監聽器,ActionListener
public class InterfaceDemo implements ActionListener {

	public void actionPerformed(ActionEvent e) {
		System.out.println("你點我了...");	
	}
}

匿名內部類作為事件監聽器

import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;  
  
public class AnonymousEvent extends JFrame{   
    JButton btn;  
  
    public AnonymousEvent(){  
        super("Java事件監聽機制");  
        setLayout(new FlowLayout());  
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  
        btn=new JButton("點選");  
        /*匿名內部類******************************/  
        btn.addActionListener(  
            new ActionListener(){  
                public void actionPerformed(ActionEvent e){  
                    Container c=getContentPane();  
                    c.setBackground(Color.red);  
                }  
            }  
        );  
        /***************************************/  
        getContentPane().add(btn);  
  
        setBounds(200,200,300,160);  
        setVisible(true);  
    }  
  
    public static void main(String args[]){  
        new AnonymousEvent();  
    }  
}   

內部類作為事件監聽器

import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;  
  
ss InnerClassEvent extends JFrame{   
    JButton btn;  
  
    public InnerClassEvent(){  
        super("Java事件監聽機制");  
        setLayout(new FlowLayout());  
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  
        btn=new JButton("點選");  
        btn.addActionListener(new InnerClass());  
        getContentPane().add(btn);  
  
        setBounds(200,200,300,160);  
        setVisible(true);  
    }  
  
    /*內部類*********************************/  
    class InnerClass implements ActionListener{  
        public void actionPerformed (ActionEvent e){  
            Container c=getContentPane();  
            c.setBackground(Color.red);  
        }  
    }  
    /**************************************/  
  
    public static void main(String args[]){  
        new InnerClassEvent();  
    }  
}