1

这是我正在尝试做的简化版本。我有一个将整数 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 事件做到这一点?属性更改事件?如果是这样,怎么做?
4

1 回答 1

1

就您的问题相关的程度而言,

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

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

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

于 2013-08-22T22:23:19.600 回答