1

我有一个程序每秒检查数据库中新插入的行,如果找到新记录,我必须清除我的 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();

但是,问题是,重绘方法有时有效,有时无效。有什么聪明的方法可以做到这一点吗?

提前致谢

4

1 回答 1

4

如果要更新模型,则不需要重新绘制 JList,尤其是fireContentsChanged(...)在添加新数据后调用模型时。确保只更改 Swing 事件线程上的模型。

考虑到你

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