这是模糊不清的,但由于某种原因,AbstractTableModel
中的通知是倒数第一,导致我的代码中出现错误。我可以解决它,但我想知道是否有人知道为什么通知以这种方式完成?
public void fireTableChanged(TableModelEvent e) {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==TableModelListener.class) {
((TableModelListener)listeners[i+1]).tableChanged(e);
}
}
}
答案 0 :(得分:3)
我认为没有真正的理由。
也许他们想要一个额外的安全性,以防一个侦听器从中移除,而事件被触发(即我们仍在迭代侦听器列表时)。
虽然这并不是必需的,因为listenerList是copy-on-write ......
答案 1 :(得分:1)
监听器被放入堆栈。因此,当他们收到通知时,他们会按照与他们相反的顺序从堆栈中“弹出”。
如果听众的顺序很重要,你应该尝试解决这个问题而不关心他们签入的顺序。如果确实重要,请改变你添加听众的顺序。