gpt4 book ai didi

java - 多线程下的 JList 重绘方法

转载 作者:行者123 更新时间:2023-11-29 03:37:05 25 4
gpt4 key购买 nike

我有一个程序每秒在数据库中检查新插入的行,如果找到新记录,我必须清除我的 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 的状态属性更改为 SwingWorker.StateValue.DONE 时,让 GUI 从 SwingWorker 获取新数据并填充 EDT 上的 ListModel
  • 然后让您的 ListModel 触发其 fireContentChanged(...) 方法。
  • ListModel 应该扩展 AbstractListModel。
  • 请注意,如果您能够使用 DefaultListModel,您甚至不必调用 fireContent....() 方法,因为 DefaultListModel 会为您完成。<

关于java - 多线程下的 JList 重绘方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14928932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com