JTable中+ TableModel的缓存读取的延迟实例事件?(JTable + TableMod

2019-08-03 20:18发布

场景:

您正在使用JTable中使用自定义的TableModel查看位于数据库或网络或任何一些集合的内容。

蛮力方法,使这项工作是在一次加载整个集合。 比方说,这是因为所需的资源不实际的。

围绕这个问题最简单的方法是在一个时间上的需求提取行,一列,由于JTable呈现的每一行,并调用TableModel.getValueAt(); 缓存是必要的。 这会导致很多次到数据库的,虽然。

有没有听滚动的一个JTable /视事件,要弄清楚它是要显示它使得每个单元前行有什么办法? 如果是这样,我想拦截并引起我的自定义TableModel来一次预读一页。

编辑:我只想澄清,这里的关键是要能够在一个批次中获取一组可见表行的内容,而不是通过自身获取的每一行的内容。

Answer 1:

实际上,这正是JTable的允许。 据我所知,如果getRowCount()方法反映到底有多少条记录存在,那么当细胞被涂,只可见部分查询。 我不认为通过听视口将更快了预取。

你可以等待所有的GetValue请求。 记录那些,返回“空”或已缓存的值。 那么之后的GetValue不要求说20毫秒做所有记录的细胞中的实际要求。 和消防rowUpdated型号事件,以便JTable中再次重绘。

** [编辑] **你可以保持的查询模型上的最后一个记录列表。 您的列表并不需要比排在屏幕上看到的量下去了。 之后的getValue()不用于查询几毫秒,你可以执行这个异步到后端批量请求

在这里,唯一的缺点是排序/过滤算法。 当您查询视窗,让数据取决于,再有就是你的数据和视图之间的关系,1-1。 一些东西,JTable中本身并不具备。 但我想有周围没有办法。 我将使IDE调试器通过阳光代码挖。 再看看他们的渲染实现如何找出重绘的行。 我不通过心脏知道。



Answer 2:

看看http://www.javaworld.com/javaworld/javatips/jw-javatip137.html文章。 在这篇文章中有一个自定义的TableModel是能够从数据库中检索行的“块”

该方案的另一个解决方案虽然不正是你要找的是延迟加载的每一行,而不是预取。 看到了自己的职位上如何做到这一点(“绑定到延迟加载数据库JTable的”搜索谷歌)。 我们的想法是,当TableModel的是要求未缓存行/加载它会返回“wait..retrieving”串为每列(假设所有列都是字符串)。 并在同一时间将安排(使用的ExecutorService)在另一个线程的任务。 然后,该任务将检索数据库中的数据,并更新数据模型。 在我的文章中,我实际使用豆类绑定所以不是Ÿ使用自定义列表自定义的TableModel。 但我敢肯定,你可以推断的想法。



文章来源: JTable + TableModel cache fetch event for lazy instantiation?