为什么AbstractTableModel上的fireTableChanged()最后通知侦听器?

时间:2012-03-01 20:02:23

标签: java swing jtable tablemodel event-queue

这是模糊不清的,但由于某种原因,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);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

我认为没有真正的理由。

也许他们想要一个额外的安全性,以防一个侦听器从中移除,而事件被触发(即我们仍在迭代侦听器列表时)。

虽然这并不是必需的,因为listenerList是copy-on-write ......

答案 1 :(得分:1)

监听器被放入堆栈。因此,当他们收到通知时,他们会按照与他们相反的顺序从堆栈中“弹出”。

如果听众的顺序很重要,你应该尝试解决这个问题而不关心他们签入的顺序。如果确实重要,请改变你添加听众的顺序。