天天看點

Java 注冊監聽器的方法總結(自身類this+外部類+内部類+匿名内部類+擴充卡Adapter+一個元件注冊多個監聽器)

Java 使用接口回調技術實作處理事件的過程,在Java中能觸發事件源的對象,都調用addXXXListener(XXXListener  listener)方法将某個對象注冊為自己的監聽器,參數listener是個接口,listener可以引用任何實作了該接口的類的所建立的對象,當事件源發生時,接口listener 立刻回調類實作的接口方法(接口的實作類包含了接口方法和非接口方法,接口隻能調用接口方法,不能調用非接口方法)。

以下是注冊監聽器的幾種常用方法:

1.自身類(this作為監聽器)

package listener_This;
/*
 * 自身類作為事件監聽器
 * 說明:點選按鈕,程式退出
 */

import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class ThisClassEvent extends Applet implements ActionListener{

	public  ThisClassEvent(){
		JButton jButton = new JButton("Exit");
		add(jButton);
		setVisible(true);		
		jButton.addActionListener(this);   //将自身類作為事件監聽器綁定到jButton上,
						   //注意這裡 this 不能寫成 new ThisClassEvent() 
		}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		System.exit(0);  //程式正常退出
	}
}
           

2.外部類作為監聽器

package listener_Outer;
/*
 * 外部類作為事件監聽器
 * 說明:建立外部監聽器類OuterClassListener,
 *     将OuterClassListener的執行個體對象作為jButton的監聽器
 * 注意:使用外部類是值得推薦的,其優點是可以處理事件的代碼和建立GUI的代碼分離,
 *     缺點是在監聽器類中無法之間通路元件(外部類可以與主類可以在同一個源檔案)
 */
import java.applet.Applet;
import javax.swing.JButton;

public class OuterClassEvent extends Applet{


	public OuterClassEvent(){
		JButton jButton = new JButton("Exit");
		add(jButton);
		setVisible(true);		
		jButton.addActionListener(new OuterCalssListener());//将OuterClassListener的執行個體對象作為jButton的監聽器
	}
}
           
/***********外部類*************/
           
package listener_Outer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class OuterCalssListener implements ActionListener{

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		System.exit(0);
	}

}
           

3.内部類作為監聽器

package listener_Inner;
/*
 * 内部類作為監聽器
 * 說明:内部類作為監聽器和外部類作為監聽器在實作上并無太大差異,隻是将監聽器類定義在主類外部和内部的差别
 */
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class InnerCalssEvent extends Applet{

	
	public InnerCalssEvent(){
		JButton jButton = new JButton("Exit");
		add(jButton);
		setVisible(true);		
		jButton.addActionListener(new InnerClassListener());  //内部類InnerClassListener的對象作為監聽器
	}
	
	class InnerClassListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			// TODO Auto-generated method stub
			System.exit(0);
		}
		
	}

}
           

4.匿名内部類作監聽器

package listener_Anonymity;
/*
 * 匿名内部類作為監聽器
 * 說明:匿名内部類的聲明格式:
 * 		new 接口()  | 父類構造器(參數)
 * 		{
 * 			//類體
 * 		}
 * 
 * 注意:一般 當事件處理方法public void actionPerformed(ActionEvent e)
 * 	比較簡單時用匿名内部類作為監聽器,否則将影響程式的可讀性
 */
import java.applet.Applet;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

public class AnonymityClassEvent extends Applet{

	public AnonymityClassEvent(){
		JButton jButton = new JButton("Exit");
		add(jButton);
		setVisible(true);		
		jButton.addActionListener(
			new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}			
		}); 
		
	}
}
           

5.擴充卡作為監聽器

package listener_Adapter;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
/*
 * 事件擴充卡作監聽器:當實作一個監聽器接口時。必須實作接口中所有的方法,否則這個類就必須聲明為abstract類。
 * 有些監聽器接口裡面的方法比較多,如WindowListener(可以檢視API),但是實際應用時往往不用實作所有的方法,
 * 這就要用到擴充卡Adapter,Adapter實作了監聽器接口裡面的所有方法,但實際上方法體都為空。是以在實際應用時可以
 * 定義一個繼承Adapter的類來作為監聽器,而在這個繼承Adapter的 類中,隻需要實作所需的方法即可。
 * 
 * 下面的程式使用擴充卡WindowAdapter作為監聽器,僅僅處理視窗關閉事件(單擊視窗上的關閉按鈕,程式退出,并列印“Exit”)
 */

public class ListenerAdapter extends JFrame{
	
	public ListenerAdapter(String name){
		super(name);  //調用JFrame 的構造器
		//初始化GUI
		setBounds(100, 100, 200, 300);
		setVisible(true);
		addWindowListener(new MyAdapter() ); // 視窗注冊監聽器
	}
	//
	class MyAdapter extends WindowAdapter{
		//重寫 windowClosing方法(WindowAdapter還實作了WindowListener的許多方法,這裡隻用到了windowClosing方法)
		@Override
		public void windowClosing(WindowEvent e) {
			// TODO Auto-generated method stub
			System.exit(0);
			System.out.println("Exit!");
		}
		
	}
	
	public static void main(String[] args){
	 new ListenerAdapter("視窗擴充卡");
	}
}
           

6.一個元件注冊多個監聽器

package listener_More;
/*
 * 一個元件注冊多個監聽器,本程式用匿名内部類作為監聽器
           
*當該事件被觸發是,多個監聽器都會響應
 */
import java.applet.Applet;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
public class MoreListener extends Applet{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public MoreListener(){
		JButton jButton = new JButton("Change to Black!");
		add(jButton);
		setVisible(true);	
		
		jButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				setBackground(Color.black);  //背景變黑
			}
		});
			
		jButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.out.println("BLACK");  //向螢幕列印“BLACK!”
			}
		});
		
	}
}