fireIntervalДобавлено в мою собственную модель, не всегда обновляет JList - PullRequest
1 голос
/ 18 октября 2011

У меня есть программа, разработанная как MVC-шаблон, где моя модель расширяет AbstractListModel.Когда я добавляю нового пользователя в мою модель, используйте следующий код:

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

РЕДАКТИРОВАТЬ: если я изменяю код на следующее:

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 сделал огонь.Спасибо!Теперь я перепишу его, так что это будет хороший код.

1 Ответ

2 голосов
/ 19 октября 2011

Помимо проблемы EDT, вы запускаете неправильный индекс. Предполагая, что пользователи уже отсортированы, вам понадобится что-то вроде следующего (все на EDT, а не просто запуск события!):

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