Swing JTable+;延迟实例化的TableModel缓存获取事件?

Swing JTable+;延迟实例化的TableModel缓存获取事件?,swing,caching,jtable,tablemodel,Swing,Caching,Jtable,Tablemodel,情景: 您正在使用带有自定义TableModel的JTable来查看位于数据库或网络上的某个集合的内容 使这项工作正常进行的蛮力方法是立即加载整个集合。比如说,由于所需的资源,这是不实际的 解决这个问题的简单方法是,在JTable呈现每一行时,按需获取行,每次一行,并调用TableModel.getValueAt();根据需要缓存。不过,这会导致对数据库的大量点击 有没有办法监听JTable的滚动/视口事件,以确定在呈现每个单元格之前它将显示哪些行?如果有,我希望拦截并使我的自定义TableMo

情景:

您正在使用带有自定义TableModel的JTable来查看位于数据库或网络上的某个集合的内容

使这项工作正常进行的蛮力方法是立即加载整个集合。比如说,由于所需的资源,这是不实际的

解决这个问题的简单方法是,在JTable呈现每一行时,按需获取行,每次一行,并调用TableModel.getValueAt();根据需要缓存。不过,这会导致对数据库的大量点击

有没有办法监听JTable的滚动/视口事件,以确定在呈现每个单元格之前它将显示哪些行?如果有,我希望拦截并使我的自定义TableModel一次预取一页


编辑:只是澄清一下,这里的要点是能够在一批中获取一组可见表行的内容,而不是必须单独获取每行的内容。

实际上,这正是JTable所允许的。就我所知 如果getRowCount()方法准确反映了记录的数量, 然后在绘制单元时,只查询可见部分。 我不认为通过在视口上侦听进行预取会更快

您可以等待所有getvalue请求。记录这些值,返回“null”或已缓存的值。然后在没有调用getvalue之后,比如说20毫秒,对所有记录的单元格执行实际请求。并更新模型上的事件,以便JTable重新绘制

**[编辑]**您可以维护模型上查询的最后记录列表。您的列表不需要超过屏幕上可见的行数。在几毫秒内未查询getValue()之后,可以对后端执行此异步批量请求

这里唯一的问题是排序/过滤算法。 当查询视口并让数据依赖于该视口时,会出现一个 1-1数据和视图之间的关系。JTable本身没有的东西。 但我想这是没有办法的。 我将启用IDE调试器来挖掘sun代码。然后查看它们的渲染实现如何找到要重新绘制的行。我不记得了

看看这篇文章。在本文中,有一个定制的TableModel,它能够从数据库中检索行的“块”


该场景的另一个解决方案是延迟加载每一行,而不是预取。关于如何做到这一点,请参阅我自己的帖子(在谷歌上搜索“JTable绑定到具有延迟加载的数据库”)。其思想是,当tablemodel请求一个未缓存/加载的行时,它将为每个列返回“wait..retrieving”字符串(假设所有列都是字符串)。同时,它将在另一个线程中调度任务(使用ExecutorService)。然后任务将从数据库中检索数据并更新数据模型。在我的帖子中,我实际上使用了bean绑定,因此使用了自定义列表而不是自定义表格模型。但我相信你可以推断出这个想法

为了保持模型视图为1-n关系,我认为最好不要查询视口,而只依赖于对模型执行的实际请求。自己检查视口不会更快。对于未填充的单元格返回“null”是没有问题的,因为当实际的大量数据从后端传入时,您可以只生成tableRow事件。jtable将再次刷新。您可以在每个model.getValue()请求时重置计时器。一旦计时器启动(比如10毫秒),检索在一个批量请求中查询的记录。