【问题标题】:Database to GlazedList/Jtable and then edit the database through the GlazedList/JTable数据库转GlazedList/Jtable,然后通过GlazedList/JTable编辑数据库
【发布时间】:2011-01-09 12:59:55
【问题描述】:

我可以把这个问题分解成两个问题:

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

以下是我所知道的:

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

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

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

【问题讨论】:

  • 我提供了一个(更简单的)答案,我的初始实施所基于的答案。但它依赖于一些更高级的 JDBC 功能,因此它可能不适合您。我忘了我还有一个指向初始代码的链接。
  • 我还要再过几天才能给你结果——做一些合同工作。
  • 不用担心,不用着急。慢慢来。工作比这更重要一点...
  • 好消息。我得到了 ResultSetTable 来显示表格。我需要将 [] 添加到表名中。现在我只需要让它正确编辑。我得到一个error in rowclasscastexception。 ClassCast 很容易修复,但不知道行中的错误...
  • 它不喜欢你的setValueAt 方法,所以我再看看...

标签: java reflection jdbc jtable glazedlists


【解决方案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

【讨论】:

  • 您能再解释一下吗?代码 sn-ps 会很棒或更多链接。
  • 现在,这个赏金值得挖掘我的旧代码的源代码并将其组合起来创建一个实现。
  • 呃,对不起:我不是在讽刺。它比 15 个接受点要好,尤其是当问题有点复杂时。问题:你知道你将使用什么 DBMS,你能保证所有的 JDBC 特性都会被支持吗?我之前对可编辑表的实现运行了几千行,并且依赖于可更新的结果集和 JDBC 元数据。并非所有驱动程序都会支持这些功能,但以另一种方式来做是......好吧,真的很混乱。
  • 我将在 Windows XP 上使用 MS-Access 2003 数据库,因此应该支持所有内容。与我认为的数据库相比,该数据库实际上相当小。总共可能只有 1000 个元素。所以无论如何都没有什么大不了的。
  • 很遗憾,您不能对此应用过滤器。为此,您需要一种基于实体的方法,每行一个对象。我一直在想一种方法来做到这一点,而不需要对象关系映射器的全部复杂性,但它很快就会变得相当复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多