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 に答える