2013-02-18 3 views
1

새로 삽입 된 행에 대해 데이터베이스에서 매초마다 검사하는 프로그램이 있는데 새 레코드가 발견되면 listModel을 지우고 데이터베이스에서 모든 데이터를 다시 검색해야합니다. 목록에 표시하십시오.멀티 스레드에서 JList 다시 그리기 방법

itemListModel.clear(); 

    ArrayList resultArrayList = DBQueries.getAllSubmittedSaleTransaction(); 
    Iterator iterate = resultArrayList.iterator(); 

    int i = 0; 
    while (iterate.hasNext()) { 
     Hashtable data = (Hashtable) iterate.next();    
     itemListModel.add(i, data); 

     this.itemList.addNotify(); 
     this.itemList.validate(); 
     this.itemList.repaint(); 

     i++; 
    } 
    this.validate(); 
    this.repaint(); 

그러나 문제는 다시 그리기 방법이 때때로 작동하지 않는 경우입니다. 이를 수행하는 현명한 방법이 있습니까? 사전

새로운 데이터를 추가 한 후 모델이 fireContentsChanged(...)를 호출 특히 경우, 모델의 갱신을하는 경우가 JList의를 칠 필요가 없습니다

답변

4

에서

감사합니다. Swing 이벤트 스레드에서만 모델을 변경해야합니다.

  • 이 SwingWorker의에서 데이터베이스 쿼리를 수행하는 것이 좋습니다.
  • 는 GUI가 SwingWorker의에서 새 데이터를 얻고 EDT에
  • 을하는 ListModel를 채우는 한 SwingWorker의 SwingWorker의의 상태 속성이 SwingWorker.StateValue.DONE로 변경
  • 에 PropertyChangeListener를 추가 한 다음의 ListModel가 fireContentChanged(...) 화재가 방법.
  • ListModel은 AbstractListModel을 확장해야합니다.
  • DefaultListModel을 사용할 수있는 경우 DefaultListModel이이 작업을 수행하므로 fireContent....() 메서드를 호출 할 필요가 없습니다.
+0

+1 나는 "때때로"라는 단어를 볼 때 EDT에서 GUI 업데이트 코드가 실행되지 않는다고 생각합니다. – camickr

+0

나에게 잘 어울리는데 ... 고마워요. – Norks

+0

@Norks : 천만에! –