2011-10-18 2 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의

편집에 문제가있다 : 난 다음에 코드를 변경하는 경우 : 완벽 작동

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); 
} 
관련 문제