java - 仅渲染 JTable 模型的一部分

标签 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. 破解渲染的方式,这样它就不会渲染所有单元格。没有找到让渲染器不执行任何操作的方法。

感谢您的帮助。

最佳答案

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

您需要的是一个能够分页的表格模型。您可以通过两种方式进行分页:

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

实现无限滚动:

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

优点:

  • 对于用户来说,似乎所有数据都可用
  • 仅加载模型请求的数据
  • 数据快速异步加载,使 View 响应速度非常快
  • 排序和过滤在后端/存储库中完成,因此无需在客户端处理和丢弃大量数据
  • 与支持过滤、排序和分页的数据库和 REST 接口(interface)配合良好。
  • 这确实是 JTables 的使用方式(模型作为适配器,UI 中的享元渲染模式)。

关于java - 仅渲染 JTable 模型的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53320288/

相关文章:

java - JTable 设置特定单元格不可编辑?

java - 呈现通过 JDBC 检索的表 - JAVA

java - 将 Spring-Boot 与 StatsD 连接的最佳方式是什么,尤其是对于计时器?

java - 事件派发线程实际上做了什么?

java - java中的自定义表格单元格编辑器,列数据类型为Float

java - GridLayout 中的 JLabel

Java - 按下按钮时如何将新的 JLabel 和 JTextPane 添加到 JPanel

java - [Java]Android Videoview 只能处理本地文件

Java BufferedImage如何知道一个像素是否透明

java - UCanAccessSQLException : constraint violation