2

我可以将这个问题分解为两个问题:

  1. 将数据库(MS-Access)的内容放入GlazedList/的最佳方法是什么JTable
  2. 如何确保对GlazedList/所做的任何更改JTable都反映在数据库 (MS-Access) 上?

以下是我所知道的:

  1. 我知道如何使用JDBC 方法从数据库中检索/操作信息。
  2. 我知道这GlazedList需要反射,所以我需要创建一个包含数据库中每个列/字段的类。这不是很可扩展...

解决这个问题的最佳方法是什么?

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

4

1 回答 1

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我上面建议的那样做呢?

于 2010-02-02T04:27:05.153 回答