以下代码摘自Oracle jdk1.8.0_40的AbstractListModel类。
我的问题是:
/**
* <code>AbstractListModel</code> subclasses must call this method
* <b>after</b>
* one or more elements of the list change. The changed elements
* are specified by the closed interval index0, index1 -- the endpoints
* are included. Note that
* index0 need not be less than or equal to index1.
*
* @param source the <code>ListModel</code> that changed, typically "this"
* @param index0 one end of the new interval
* @param index1 the other end of the new interval
* @see EventListenerList
* @see DefaultListModel
*/
protected void fireContentsChanged(Object source, int index0, int index1)
{
Object[] listeners = listenerList.getListenerList();
ListDataEvent e = null;
for (int i = listeners.length - 2; i >= 0; i -= 2) {
if (listeners[i] == ListDataListener.class) {
if (e == null) {
e = new ListDataEvent(source, ListDataEvent.CONTENTS_CHANGED, index0, index1);
}
((ListDataListener)listeners[i+1]).contentsChanged(e);
}
}
}
我的问题是:
- 为什么迭代从
listeners.length - 2
开始,listeners.length - 1
元素呢? - 为什么事件针对每个其他元素触发 (
i -= 2
)? - 为什么迭代以相反的顺序进行?
addListDataListener
以了解为什么要这样实现。还要注意,侦听器按照它们添加到模型的相反顺序被调用。 - Dakshinamurthy Karralisteners.length - 2
和i -= 2
的问题是相关的。我现在无法检查代码,但我能想到的直接解释是每次注册侦听器时可能会向listenerList
添加两个元素,而只有其中一个应该被通知。 - Chopjavax.swing.event.EventListenerList
зҡ„жәҗд»Јз ҒжҸҗдҫӣдәҶе…Ёйқўзҡ„ж–ҮжЎЈпјҢи§ЈйҮҠдәҶдёәд»Җд№ҲиҰҒд»Ҙиҝҷз§Қж–№ејҸдҪҝз”ЁиҜҘзұ»зҡ„е®һдҫӢгҖӮ - Oleg EstekhingetListenerList
的 Javadoc。我以为那里会有答案,但既然没有,我就在这里发帖了。不过另外一件事,getListenerList
的 Javadoc 不应该包含这个信息吗? - Can't Tell