事件驱动模型:
事件监听器<--注册--事件源--当事件发生时通知-->事件监听器
原理分析:
任何事件监听器XXXListener都是一个接口,继承于EventListener,其中包括事件发生时的处理方法。
而每个事件源都有一个事件监听器列表EventListenerList,当事件源调用addXXXListener注册事件监听器XXXListener时,在addXXXListener方法内将调用EventListenerList的add方法将监听器及其class属性加入监听器列表中。当某种事件发生时,事件源根据事件类型(class属性)遍历EventListenerList找到相应的监听器,执行相应的处理方法。
实例分析:
ListModel是事件源,JList是时间监听器,发生ListDataEvent。主要针对ListModel发生变化时,JList随之改变这种情况。
1.注册监听器。
JList有个内部类AccessibleJList实现了ListDataListener,重写了
public void intervalAdded(ListDataEvent e){}
并在构造方法内调用了JList的getModel方法得到ListModel,然后为其添加监听器。
JList.this.getModel().addListDataListener(this);
2.事件发生。
当调用ListModel(DefaultListModel)的add()等方法时,改变了ListModel,所有会调用ListModel的方法
protected void fireIntervalAdded(Object source, int index0, int index1) //激活元素添加导致的ListDataEvent
在fireIntervalAdded内部会遍历事件监听器列表查找ListDataListener,然后调用该监听器的intervalAdded()方法。下
为时序图: