事件源将在发生事件时向所有的注册的监听器发送事件对象,监听器对象使用事件对象中的信息来确定它们对事件的响应。
理解如下:事件源对象首先注册监听器对象,当触发事件源时事件源发送事件对象,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; } }