多线程的JList重绘方法

时间:2013-02-18 03:13:39

标签: java swing concurrency jlist defaultlistmodel

我有一个程序可以检查数据库中每一秒的新插入行,如果找到新记录,我必须清除listModel并再次从数据库中检索所有数据并在列表中重新显示。 / p>

    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();

但问题是,重绘方法有时有时不起作用。 有没有聪明的方法来实现这个目标?

提前致谢

1 个答案:

答案 0 :(得分:4)

如果要更新模型,则不需要重新绘制JList,尤其是在模型在添加新数据后调用fireContentsChanged(...)时。请务必仅在Swing事件线程中更改模型。

考虑一下

  • 在SwingWorker中执行数据库查询。
  • 将PropertyChangeListener添加到SwingWorker
  • 当SwingWorker的state属性更改为SwingWorker.StateValue.DONE时,让GUI从SwingWorker获取新数据并在EDT上填充ListModel
  • 然后让ListModel触发其fireContentChanged(...)方法。
  • ListModel应该扩展AbstractListModel。
  • 请注意,如果您能够使用DefaultListModel,则甚至不必调用fireContent....()方法,因为DefaultListModel会为您执行此操作。