對於Java監聽器的理解
阿新 • • 發佈:2019-02-17
監聽器模式,包括三個重要的物件,即事件源、事件物件以及監聽器物件。
事件源將在發生事件時向所有的註冊的監聽器傳送事件物件,監聽器物件使用事件物件中的資訊來確定它們對事件的響應。
理解如下:事件源物件首先註冊監聽器物件,當觸發事件源時事件源傳送事件物件,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;
}
}