用于渲染未知行数的 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的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MySQL 将确切的行数加载到 jTable 并对剩余的行进行分页?