Java:更新TableModel数据的正确方法?

时间:2013-08-22 19:08:02

标签: java swing list events defaulttablemodel

这是我正在尝试做的简化版本。我有一个映射将整数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 Events执行此操作? PropertyChangeEvent的?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

就您的问题而言,

  1. 没有;当新数据可用时,您的updateData()方法应更新TableModel的内部数据结构并触发相应的事件;因为DefaultTableModelList一无所知,所以延伸AbstractTableModel,如图所示here; JTable会自行更新。

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

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