【问题标题】:JList repaint method at multi-threaded多线程的JList重绘方法
【发布时间】:2013-02-02 10:46:01
【问题描述】:

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

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

提前致谢

【问题讨论】:

    标签: java swing concurrency jlist defaultlistmodel


    【解决方案1】:

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

    考虑到你

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

    【讨论】:

    • +1,当我看到“有时”这个词时,我认为在 EDT 上没有执行 GUI 更新代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多