用于呈现未知行数的JTable

时间:2013-01-22 01:20:21

标签: java swing jdbc jtable rendering

我有一个返回大量行的数据库查询。 JDBCJTable中显示行之前,Iterable<R>没有告诉您有多少行返回,并且有太多行要计算它们。

所以我正在使用的模型是TableRowModel,但遗憾的是,non-JTable必须事先知道行数。

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

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

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

表格上的“查找”等操作理想情况下应该以“可理解的”方式工作......所以看起来这似乎不会太容易。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您有两种可能性:

  1. 写入查询,返回行数,然后执行 表模型,尝试从数据库加载行,如果是表 想要显示模型中没有的行。在这种情况下,您需要第三个查询, 它可以基于索引加载行(这些查询可能在 MS-SQL和Oracle)。例如:您加载前100行,和 结果的数量。如果要求表模型来自 位置100到199您创建新查询,加载这些行 间隔(如果您的数据库可能)或您尝试 迭代结果集,并加载下一个数据批处理。但如果 用户按下“结束”键,你肯定需要基于索引 加载(或者您需要迭代完整的结果集)。
  2. 您编写的模型显示了第一批(例如100)     行)。如果是user,则滚动查看最后一行(model.getValueAt(row,     col) - &gt; col == 99)你只是询问下一批的结果集     将新行添加到模型中。
  3. 第一个变体对用户来说更好(因为用户可以看到表的大小并且可以直接滚动到最后一行),但第二个变量更容易实现,因为它不需要基于索引的行加载。