这是我正在尝试做的简化版本。我有一个映射将整数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();
我的问题是:
答案 0 :(得分:1)
就您的问题而言,
没有;当新数据可用时,您的updateData()
方法应更新TableModel
的内部数据结构并触发相应的事件;因为DefaultTableModel
对List
一无所知,所以延伸AbstractTableModel
,如图所示here; JTable
会自行更新。
没有;您的数据库访问层应该不保留对查询对象的引用,并且不需要克隆;使用process()
SwingWorker
方法或类似方法将查询对象转发到您的显示图层。
使用TableModelListener
了解TableModel
何时以及如何变更;相应地更新数据库。