用于渲染未知行数的 JTable

Posted

技术标签:

【中文标题】用于渲染未知行数的 JTable【英文标题】:JTable for rendering an unknown number of rows 【发布时间】:2013-01-05 04:23:05 【问题描述】:

我有一个返回大量行的数据库查询。 JDBC 不会告诉您返回多少行,并且在我将其显示在 JTable 之前,有太多行无法计算。

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

我可以想象一些可行的策略:

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

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

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

【问题讨论】:

如果您想一次性加载所有数据,我一直在使用 select count(column) ... 来获取大致的行数。顺便说一句,如果你使用 DefaultTableModel,你应该能够使用它的 addRow 方法在其中添加数据。 【参考方案1】:

你有两种可能:

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

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

【讨论】:

这是使用 Derby,所以实际上,执行 COUNT(*) 涉及迭代行,并且速度很慢。 :( 好的,但是你可以实现第二种方式。第一种方式只能通过 SQL 和 JDBS 实现。 是的,您的方法 2 对应于我在问题中列出的第二种方法。 :) 我对“我能做到的方式”并不真正感兴趣,我已经列出了四种方式来做到这一点。我只是在寻找“常见”/“正确”的方法。【参考方案2】:

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

【讨论】:

以上是关于用于渲染未知行数的 JTable的主要内容,如果未能解决你的问题,请参考以下文章

未知行数的文字在div中垂直居中

如何从 MySQL 将确切的行数加载到 jTable 并对剩余的行进行分页?

使用python计算文件中删除行数的最佳方法

统计代码行数的实用脚本

如何从MySQL中将精确的行数加载到jTable并对其余的分页?

设置 HTML 表格的最大显示行数