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

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

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

以下是我所知道的事情:

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

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

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

我有一个非常类似的问题,我认为我的结果也是类似的,除了它不需要reflection(静态数据库模式)。 您需要为每一行创建行对象(可能只包括行号和对ResultSet和列信息的引用)。

然后编写一个ca.odell.glazedlists.gui.WritableTableFormat实现来将这些对象映射到表格单元格。

为了避免#2出现问题,您可以创建一个灵活的行类,该类从ResultSet中提取一次列信息并将其缓存以供重用。

编辑:我找到了一个原始的,更简单的实现(相当简单),我的基础。 您可以在此处查看: ResultSet表 。 它可能足以满足您的目的。 然后将其添加到链接提供的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:另一种方法

那么使用一个Object-relational映射器库,然后像我上面建议的那样执行ca.odell.glazedlists.gui.WritableTableFormat呢?

    Interesting Posts