1. 程式人生 > >對於Java監聽器的理解

對於Java監聽器的理解

      監聽器模式,包括三個重要的物件,即事件源、事件物件以及監聽器物件。

     

      事件源將在發生事件時向所有的註冊的監聽器傳送事件物件,監聽器物件使用事件物件中的資訊來確定它們對事件的響應。

       理解如下:事件源物件首先註冊監聽器物件,當觸發事件源時事件源傳送事件物件,eg:如果是按鈕源則將按鈕的動作事件物件傳送給監聽器物件,有監聽器物件處理事件物件,其中事件物件封裝或者說是包含了事件源物件的資訊。
        那麼問題是,事件物件是如何什麼時候產生的,又是如何傳入到監聽器物件中的?

        即點選click時執行AbstractButton中的doClick(int)方法,觸動DefaultButtonModel中的
        setPressed(boolean),進而執行fireActionPerformed(),回撥監聽器類。

        例子:

package Test;

import java.util.List;
import java.util.Vector;

public class PersonSource {
	private List<PersonListener> listeners = new Vector<PersonListener>();
	public void eat(){
		for(PersonListener t:listeners){
			t.isCanEat(new PersonEvent(this));
		}
	}
	public void run(){
		
	}
	public void addPersonListener(PersonListener listener){
		listeners.add(listener);
	}
	public void removePersonListener(PersonListener listener){
		listeners.remove(listener);
	}
	
	public static void main(String[] args) {
		PersonSource person = new PersonSource();
		person.addPersonListener(new PersonListener() {
			
			@Override
			public void isCanEat(PersonEvent event) {
				PersonSource source = event.getSource();
				System.out.println(source.getClass());
			}
		});
		person.eat();
	}
}

package Test;

public interface PersonListener {
	public void isCanEat(PersonEvent event);
}

package Test;

public class PersonEvent {
	private PersonSource person;
	public PersonEvent(PersonSource person){
		this.person = person;
	}
	public PersonSource getSource(){
		return person;
	}
}