1

如何启用 JTable 图标和行为以按列对表行进行排序,而不让它使用比较谓词进行排序?也就是说,如何告诉表头在正在使用的列中显示升序/降序排序的箭头,并在排序顺序/列更改时让它调用适当的方法?

我正在尝试创建一个由 SQL 查询或视图支持的(可编辑、可过滤、可排序的)JTable。这些行可能不适合内存,并且可能无法干净地映射到 java 对象,所以我想在 SQL 中进行所有排序/过滤。我已经编写了用于更改查询以适应按列排序、按值过滤和可见列的代码。

TYPE_SCROLL_SENSITIVE,为了使用它,我计划使用and编写基于 ResultSet 的 JTableModel CONCUR_UPDATABLE,因此对 DB 的更改会传播到 ResultSet。我将定期(每秒几次)强制刷新 ResultSet 中的可见 JTable,因此对数据库的更改对用户可见。用户对表的更改将在验证后传递给可更新的 ResultSet。

我已经稍微了解了排序是如何正常进行的,但大多数实现似乎都依赖于 JTable 创建一个带有 Comparator 谓词的 javax.swing.RowSorter,或者依赖于维护一个在更改时触发事件的排序行列表。所以,我的问题:

ORM 框架不是这个问题的答案,因为数据不能很好地映射到实体对象。另外,我使用的 DBMS 是 H2。

编辑:不幸的是,基于应用比较器或对行对象排序谓词的可排序 JTable 库也不合适。我不相信我能够将所有对象保存在内存中以执行排序。这个问题使我无法使用 SwingX JXTables、GlazedLists 或类似的库。我希望我能,但我不能。时期。

** 我将处理数千行,可能是数百万行,以及许多列。是的,我确实需要使用 SQL 来进行排序和过滤。**

问题:(按重要性递减)

  1. 如何显示用于对行进行排序的列的指标?
  2. 当左键单击列标题以更改排序顺序时,如何让 JTable 触发适当的事件?
  3. 有没有更简单的方法可以在数据库更改时强制 JTable 更新?
  4. 是否有一个库可以使这一切变得相当容易(连接数据库查询或视图和 JTables)?
  5. 当我设计这样的系统时,我会遇到可怕的、可怕的问题吗?
4

4 回答 4

1

在回答 1 和 2 时,请查看SwingX,它已经包含一个带有内置排序(和过滤)的表类。您也许可以适应这一点。

当我设计这样的系统时,我会遇到可怕的、可怕的问题吗?

从经验来看,是的。我从事的项目几乎与此完全相同,有人设计了一个据称“神奇地”绑定到数据库表的 JTable。这种将显示逻辑和数据库访问耦合在一起形成了一个可怕的混乱局面,我们完全用反射驱动的表模型和单独的记录 CRUD 操作来替换它。

你说ORM不是答案......

  • 如果数据的格式没有改变,那么无论如何都值得考虑。您的“实体”类不需要代表真实世界的实体。

  • 如果(我怀疑)您的实体格式发生变化,则可能值得考虑:

    • 一个灵活的基于地图的Record类,将记录存储为键值对;

    • 为您的显示逻辑动态构建的表模型,通过查询记录键构建,插入 SwingX 表以免费进行排序和过滤;

    • 一个类似设计的Repository类,它将您的数据库访问与表本身分开封装,负责加载和保存Records。这充当了可更新ResultSet和视图之间的适配器(尽管我会检查使用ResultSet这种方式是否需要在数据可见时打开数据库连接......)。

    这种分离为“显示和排序记录的表”和“管理数据的存储库”意味着:

    • 您可以将表重用于非数据库绑定数据;
    • 您可以在表格以外的其他事物中显示数据库绑定的记录;
    • 你不会因为试图构建和测试这个东西而发疯:)
于 2009-05-26T21:59:12.667 回答
1

我自己从未使用过它,但JIDE Data Grids提供了一个 DatabaseTableModel,它使用 SQL WHERE 和 ORDER BY 提供过滤和排序支持。

于 2009-05-27T08:38:36.387 回答
1

您应该能够继承 javax.swing.RowSorter 以创建在数据库中进行排序的行排序器。从 API 文档:

“RowSorter 实现通常没有与底层模型的一对一映射,但它们可以。例如,如果数据库进行排序,toggleSortOrder 可能会调用数据库(在后台线程上),并覆盖映射方法以返回传入的参数。”

http://docs.oracle.com/javase/6/docs/api/javax/swing/RowSorter.html

于 2012-06-08T11:28:16.823 回答
0

撇开数据库的东西不谈,有一个名为SortableTable的类,它是 JIDE Grids 的一部分。它在表格标题中显示带有一点 ^ 或 v 的排序,并支持按 1 列以上(1v、2v 等)排序。

替代文字

于 2009-05-26T22:08:52.630 回答