我有一个程序,它每秒都会检查数据库中是否有新插入的行,如果发现新记录,我必须清除我的listModel,然后再次从数据库中检索所有数据,并将其重新显示在列表中。
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();
但是,问题是,重新绘制方法有时有效,有时无效。有什么聪明的方法可以做到这一点吗?
提前感谢
如果您正在更新模型,则不需要重新绘制JList,尤其是如果您的模型在添加新数据后调用fireContentsChanged(...)
。请确保只在Swing事件线程上更改模型。
考虑一下你的
- 在SwingWorker中执行数据库查询
- 向SwingWorker添加PropertyChangeListener
- 当SwingWorker的state属性更改为
SwingWorker.StateValue.DONE
时,让GUI从SwingWorkers获取新数据,并在EDT上填充ListModel - 然后让ListModel激发其
fireContentChanged(...)
方法 - ListModel应该扩展AbstractListModel
- 请注意,如果您能够使用DefaultListModel,您甚至不必调用
fireContent....()
方法,因为DefaultListModel将为您执行此操作