【问题标题】:Java: Proper way to update TableModel's data?Java:更新 TableModel 数据的正确方法?
【发布时间】:2013-08-22 19:08:01
【问题描述】:

这是我正在尝试做的简化版本。我有一个将整数 id 映射到字符串列表的映射。地图中的这些列表之一始终由 JTable 显示。 (取决于需要显示的 id)地图的所有信息都来自数据库,并且不断地被添加和删除。 我的 DataClass 存储完整地图并从数据库接收更新:

DataClass {
   Map(Integer, List<String>) map;

   // TabelModel gets list here
   public List<String> getList(int id) {
       return map.get(id);
   }

   // Updates from database come here
   public updateList(int id, String info) {
       if (map.containsKey(id) {
          map.get(id).add(info);
       }
       else {
          map.put(id, new List<String>(info));
       }
   }

   // Remove from list, etc all down here
   ...
}

我的表格模型类:

MyTableModel extends DefaultTableModel {
    List data;

    public void updateData(int id) {
        data = getList(id)
        fireTableDataChanged();
    }

    ... All the other stuff needed ...
}

由于数据库更新是分批进行的,我知道在批处理结束时我必须更新表。因此 DataClass 通知 UI 类,该类通知表进行更新。这会导致调用 updateData(id) 从 DataClass 中检索一组新数据并调用 fireTableDataChanged();

我的问题是:

  1. 这是更新/存储表中数据的正确方法吗?
  2. getList 是否应该返回数据的克隆?如果我只是返回引用,则数据库中的所有更新都将访问相同的引用,并且由于这些更新未在 EDT 中运行,这不会是坏事/皱眉/错误吗?
  3. 如何使用 Java 事件来做到这一点?属性更改事件?如果有,怎么做?

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing list events defaulttablemodel


【解决方案1】:

如果你的问题是相关的,

  1. 不;当有新数据可用时,您的 updateData() 方法应该更新您的 TableModel 的内部数据结构并触发适当的事件;因为DefaultTableModel对你的List一无所知,扩展AbstractTableModel,如图hereJTable 将自我更新作为响应。

  2. 不;您的数据库访问层不应保留对查询对象的引用,并且不需要克隆;将查询到的对象从SwingWorkerprocess() 方法或类似方法转发到您的显示层。

  3. 使用TableModelListener 了解TableModel 何时以及如何更改;相应地更新数据库。

【讨论】:

    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多