Почему fireTableChanged () в AbstractTableModel уведомляет слушателей в последнюю очередь? - PullRequest
0 голосов
/ 02 марта 2012

Это неясно, но по какой-то причине уведомление в 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 ]

3 голосов
/ 02 марта 2012

Не думаю, что для этого есть реальная причина.

Может быть, они хотели дополнительной безопасности в случае, если слушатель удаляет себя из списка слушателей , а событиеfired (т. е. пока мы еще перебираем список слушателей).

Хотя в этом нет необходимости, поскольку listenerList копируется при записи ...

1 голос
/ 02 марта 2012

Слушатели попадают в стек. Поэтому, когда они получают уведомление, они «выталкиваются» из стека в обратном порядке, в котором они помещаются.

Если порядок слушателей имеет значение, вы должны попытаться решить это, не обращая внимания, в каком порядке они отмечены. Если это имеет значение, измените порядок добавления слушателей.

...