我有一个非常相似的问题,我认为我的结果也很相似,只是它不需要反射(静态数据库模式)。您需要为每一行创建行对象(可能只包括行号和对 ResultSet 和列信息的引用)。
然后编写一个ca.odell.glazedlists.gui.WritableTableFormat
实现将这些对象映射到表格单元格。
为避免 #2 出现问题,您可以创建一个灵活的行类,从 ResultSet 中获取一次列信息并将其缓存以供重用。
编辑:我发现了我所基于的原始且更简单的实现(相当简单)。您可以在此处查看:ResultSet Table。它可能足以满足您的目的。然后将其添加到链接提供的 AbstractTableModel 实现中。
public void setValueAt(Object ob, int row, int column) throws SQLException {
resultSet.absolute(r+1);
if (ob == null) {
resultSet.updateNull(column+2);
} else {
resultSet.updateObject(column+2,ob);
}
rs.updateRow();
this.fireTableCellUpdated(row,column);
}
public boolean isCellEditable(int row, int col) {
return true;
}
但是有三个问题:您的 ResultSet 需要可更新,支持双向滚动,并对数据库的更新敏感。这些是 JDBC 规范的一部分,但并非所有驱动程序都支持它们,您需要确保在创建 ResultSet 时启用它们。在这种情况下,您只需this.fireTableDataChanged()
定期强制对表数据进行全面更新。这不是最快的方法,但确实有效。
Edit2:另一种方法
使用对象关系映射器库之一,然后按照ca.odell.glazedlists.gui.WritableTableFormat
我上面建议的那样做呢?