我能够将这个问题分解为两个问题:
GlazedList
/ JTable
的最佳方法是什么?GlazedList
/ JTable
所做的任何更改都反映在数据库中(MS-Access)?以下是我所知道的事情:
GlazedList
需要反思所以我需要
创建一个包含每个的类
数据库中的列/字段。这个
不是很容易扩展... 解决这个问题的最佳方法是什么?
编辑:// 我设法创建了一个类生成器。它采用列标题并创建实例字段。这应解决#2 http://pastebin.ca/1770996 - 它创建了类,但我认为我没有正确使用反射... edit2:// 从上方编辑了我的代码,因此可以正常使用... http://pastebin.ca/1776722
答案 0 :(得分:1)
我有一个非常类似的问题,我认为我的结果也是类似的,除了它不需要反射(静态数据库模式)。您需要为每一行创建行对象(可能只包含行号和对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()
以强制完全更新表数据。这不是最快的方法,但确实有效。
如何使用其中一个对象关系映射器库,然后像我上面建议的那样执行ca.odell.glazedlists.gui.WritableTableFormat
?