【问题标题】:Why does fireTableChanged() on AbstractTableModel notify listeners last to first?为什么 AbstractTableModel 上的 fireTableChanged() 会先通知侦听器?
【发布时间】:2012-03-01 20:02:23
【问题描述】:

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

【问题讨论】:

  • 为什么你需要你的听众按一定的顺序触发?那是一种设计的味道。
  • "last-to-first,导致我的代码中出现错误。" 不,您的代码中的错误是由首先假定顺序引起的。解决这个问题,其余的就变得无关紧要了。

标签: java swing jtable tablemodel event-queue


【解决方案1】:

我认为没有真正的原因。

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多