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의
편집에 문제가있다 : 난 다음에 코드를 변경하는 경우 : 완벽 작동
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! 이제 코드를 다시 작성하여 멋진 코드로 만들 것입니다.
동기화 문제 일 수 있습니까? 'AbstractListModel' 또는'JList'에는 아무런 문제가 없습니다. –
편집 : 흠. 모델에서 동기화 된 모든 것을 제거했습니다. 하지만 여전히 그 임의의 버그 : (addUser 메서드는 다른 스레드 (스윙 스레드가 아닌)에서 호출됩니다. – joxxe
모델은 EDT에서 업데이트해야합니다. – camickr