3

我有一个返回大量行的数据库查询。JDBC没有告诉你有多少行回来了,在我将它显示在JTable.

所以我正在使用的模型是一个Iterable<R>,但不幸的是,TableRowModel必须预先知道行数。

我可以想象一些可能有效的策略:

  • 加载所有行,但在后台执行并将它们批量添加到模型中。
  • 以某种方式检测呈现较低行的请求(通过我猜的模型)并在发生这种情况时动态加载更多行。
  • 在屏幕上有一个按钮来显式加载更多行。
  • 某种non-JTable支持渲染行而不事先知道行数的组件(理想,但我找不到。)

我想知道是否有一种“正常”的方式来做到这一点,因为我在 UI 中并不经常看到这种事情。我检查过的几个JDBC工具(我认为这些是最好的选择)似乎要么急切地加载结果,要么分页(作为用户,我真的不喜欢 GUI 应用程序中的分页,所以我想避免这种情况。)

不过,像“查找”这样的操作在理想情况下应该以“可理解”的方式工作......所以看起来这不会太容易。

4

2 回答 2

3

SwingWorker在您的实现中使用AbstractTableModel. 让工作人员对查询进行分区,以便及时获得合理数量的记录,而其余的则在后台读取。使用 aPropertyChangeListener显示进度并实现取消按钮。

于 2013-01-22T10:59:44.223 回答
1

你有两种可能性:

  1. 编写查询,返回行数,然后实现表模型,如果表要显示不在模型中的行,则尝试从数据库中加载行。在这种情况下,您需要第三个查询,它可以基于索引加载行(这些查询在 MS-SQL 和 Oracle 中是可能的)。例如:您加载前 100 行,以及结果的数量。如果表模型要求从位置 100 到 199 的行,您将进行新查询,加载这些行间隔(如果您的数据库可能),或者您尝试迭代您的结果集,并加载下一个数据批次。但是,如果用户按下“结束”键,您肯定需要基于索引的加载(或者您需要遍历完整的结果集)。
  2. 您编写模型,显示第一批(例如 100 行)。如果用户滚动查看最后一行 (model.getValueAt(row, col) -> col == 99),您只需询问下一批的结果集并将新行添加到模型中。

第一个变体对用户更好(因为用户可以看到表有多大并且可以直接滚动到最后一行),但第二个更容易实现,因为它不需要基于索引的行加载。

于 2013-01-22T07:47:16.610 回答