仅呈现JTable模型的一部分

时间:2018-11-15 13:12:29

标签: java swing jtable

我有一个大型模型要显示在JTable中,我需要找到一种以通常的方式对数据进行分页的方法:显示25个条目,50个,100个,200个或所有条目,等等。但是我需要这样做同时保留排序和过滤数据的能力,并且应该优先于行限制。例如,如果我有一个1000000条目,其中每个字母大约以50000开始,并且我想显示前100个项目,然后仅过滤以G开头的元素,那么我应该具有以G开头的前100个元素。将过滤器更改为B,它应显示以B开头的前100个元素,这些元素以前是不可见的。另外,在没有过滤器的情况下,排序应显示以A开头的前100个条目,再次排序应显示以Z开头的前100个条目。

我尝试过的事情:

  1. 在模型中将getRowCount返回的值限制为值k。这是行不通的,因为它是对原始k值进行排序/过滤。
  2. 我尝试编写仅接受前k个条目的自定义过滤器。这是行不通的,因为过滤器在排序之前应用了一次,并且我不知道如何在排序后重新应用。
  3. 在渲染过程中遇到麻烦,因此无法渲染所有单元格。没有找到要求渲染器不执行任何操作的方法。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

不要弄乱渲染和表格本身-问题出在其他地方。

您需要的是具有分页功能的表模型。您可以通过两种方式进行分页:

  • 基于网站的分页(Google风格):每页显示N个条目,仅显示特定页面(使用按钮更改当前页面:[<] [1] [2] [3 ] ... [>])
  • 无限滚动:虚拟表模型,按需加载可见数据。如果您问我,显然是更好的解决方案。

实现无限滚动:

  • 表模型充当存储库的适配器,在该存储库中获取实际数据(支持过滤分页(获取行数)并请求具有偏移量和页面尺寸的页面)和排序)。
  • 表模型缓存请求的数据页面。
  • 当请求特定行时(通过表模型接口),表模型尝试从缓存中为该行提供服务。如果未缓存该行,则表模型将触发异步页面加载,并返回一个空(前哨)行(然后单元格渲染器可以显示此类行的加载指示符)。
  • 异步页面加载从存储库中加载请求的页面(并确保多次同时请求同一页面时仅加载一次该页面),并将它们返回到表模型。
  • 表模型一旦收到异步请求的页面,就会为接收到的页面的行触发一个表模型更改事件,因此该表将被正确地重新绘制。

优势:

  • 对于用户来说,似乎所有数据都可用
  • 仅加载模型请求的数据
  • 数据可以快速且异步地加载,从而使视图响应速度更快
  • 排序和过滤是在后端/存储库中完成的,因此无需在客户端中处理和丢弃大量数据
  • 与支持过滤,排序和分页的数据库和REST接口配合良好。
  • 这实际上就是打算使用JTables的方式(作为适配器的模型,UI中的举重渲染模式)。