2011-10-18 15 views
1

私のモデルはAbstractListModelを拡張したMVCパターンとして設計されたプログラムを持っています。 私は私のモデルに新しいユーザーを追加使用、次のコードです:自分自身でfireIntervalAddedモデルは常にJListを更新しません

public synchronized void addUser(User u) { 
    if (!users.contains(u)) { 
     users.add(u); 
     Collections.sort(users); 
     //fire 
     fireIntervalAdded(ListDataEvent.INTERVAL_ADDED, getSize(), getSize()); 
    } 
} 

そして、それは時々、正常に動作します。しかし、JListは常に更新していません。時にはそれは動作し、時には...何か手がかりはありませんか?そしてもちろん、ユーザーは常にモデルに追加された追加イムが、fireIntervalAdded/JListの

EDITに何か問題があります:私は、次のコードを変更した場合:それは完璧に動作します

public void addUser(final User u) { 
    if (!users.contains(u)) { 
     users.add(u); 
     Collections.sort(users); 
    } 
    EventQueue.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     fireIntervalAdded(this, getSize(), getSize()); 
     } 
    }); 
} 

。それで問題は、火事のことをしたEDTがそれではなかったということでした。 Thx!今私はそれを素直なコードにするように書き直します。

+0

それは同期の問題だろうか? 'AbstractListModel'や' JList'には何も問題はないでしょう。 –

+0

編集:うーん。私はちょうどモデルのすべての同期を削除しました。しかし、それでもランダムなバグ:(メソッドaddUserは別のスレッド(スイングスレッドではない)から呼び出されます – joxxe

+3

モデルはEDTから更新する必要があります – camickr

答えて

2

EDTの問題以外に、間違ったインデックスを発行しています。ユーザーと仮定すると、すでにあなたは、次のような何か必要があるだろうにソートされます(イベントのちょうど発火、すべてのEDTではないが!):

int index = Collections.binarySearch(users, u); 
if(index < 0) { 
    int insertionPoint = -(index + 1); 
    users.add(insertionPoint, u); 
    fireIntervalAdded(this, insertionPoint, insertionPoint); 
} 
関連する問題