0

这很模糊,但由于某种原因,通知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);
        }
    }
}
4

2 回答 2

3

我认为没有真正的原因。

也许他们想要额外的安全,以防监听器在事件被触发时从监听器列表中删除即当我们仍在迭代监听器列表时)。

虽然这实际上不是必需的,因为 listenerList 是写时复制...

于 2012-03-01T20:28:54.707 回答
1

听众被放入堆栈。因此,当他们收到通知时,他们会以与放入堆栈的相反顺序“弹出”出堆栈。

如果侦听器的顺序很重要,您应该尝试解决该问题,而不用关心它们签入的顺序。如果确实重要,请更改添加侦听器的顺序。

于 2012-03-01T20:10:20.733 回答