数据库到GlazedList / Jtable,然后通过GlazedList / JTable编辑数据库

时间:2010-01-26 14:16:18

标签: java reflection jdbc jtable glazedlists

我能够将这个问题分解为两个问题:

  1. 将数据库(MS-Access)的内容放入GlazedList / JTable的最佳方法是什么?
  2. 如何确保对GlazedList / JTable所做的任何更改都反映在数据库中(MS-Access)?
  3. 以下是我所知道的事情:

    1. 我知道如何检索/操纵 来自数据库的信息 JDBC method
    2. 我知道GlazedList     需要反思所以我需要     创建一个包含每个的类     数据库中的列/字段。这个     不是很容易扩展...
    3. 解决这个问题的最佳方法是什么?

      编辑:// 我设法创建了一个类生成器。它采用列标题并创建实例字段。这应解决#2 http://pastebin.ca/1770996 - 它创建了类,但我认为我没有正确使用反射... edit2:// 从上方编辑了我的代码,因此可以正常使用... http://pastebin.ca/1776722

1 个答案:

答案 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()以强制完全更新表数据。这不是最快的方法,但确实有效。


Edit2:另一种方法

如何使用其中一个对象关系映射器库,然后像我上面建议的那样执行ca.odell.glazedlists.gui.WritableTableFormat