2013-02-18 60 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(); 

但問題是重繪方法有時有時不工作。 有沒有什麼聰明的方法來完成這個?

在此先感謝

回答

4

你不應該需要重新繪製JList中,如果你正在更新的模式,特別是如果已經添加了新的數據後,你的模式要求fireContentsChanged(...)。確保只更改Swing事件線程上的模型。

考慮您

  • 做一個SwingWorker的數據庫查詢。
  • 添加一個PropertyChangeListener的SwingWorker
  • 當SwingWorker類的狀態屬性更改爲SwingWorker.StateValue.DONE,已在GUI得到來自SwingWorker的新數據和填充的ListModel在EDT
  • ,然後讓ListModel的觸發其fireContentChanged(...)方法。
  • ListModel應該擴展AbstractListModel。
  • 請注意,如果你能夠使用DefaultListModel,你甚至不必調用fireContent....()方法,因爲DefaultListModel會爲你做的。
+0

+1,當我看到這個詞「有時」,我覺得沒有在EDT執行GUI更新代碼。 – camickr 2013-02-18 05:11:02

+0

看起來不錯,我...謝謝 – Norks 2013-02-18 07:20:02

+0

@Norks:歡迎您! – 2013-02-18 17:17:36