Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅渲染JTable的一部分';s模型_Java_Swing_Jtable - Fatal编程技术网

Java 仅渲染JTable的一部分';s模型

Java 仅渲染JTable的一部分';s模型,java,swing,jtable,Java,Swing,Jtable,我有一个大模型要在JTable中显示,我需要找到一种方法来分页数据,以通常的方式:显示25个条目、50个、100个、200个或全部,等等。但是我需要这样做,同时保持排序和筛选数据的能力,这应该优先于行限制。例如,如果我有1000000个条目,其中大约50000个条目以每个字母开头,我想显示前100个条目,然后只过滤以G开头的元素,我应该有以G开头的前100个元素。如果我将过滤器更改为B,它应该显示以B开头的前100个元素,以前是看不见的。此外,如果没有过滤器,排序应显示以A开头的前100个条目,

我有一个大模型要在JTable中显示,我需要找到一种方法来分页数据,以通常的方式:显示25个条目、50个、100个、200个或全部,等等。但是我需要这样做,同时保持排序和筛选数据的能力,这应该优先于行限制。例如,如果我有1000000个条目,其中大约50000个条目以每个字母开头,我想显示前100个条目,然后只过滤以G开头的元素,我应该有以G开头的前100个元素。如果我将过滤器更改为B,它应该显示以B开头的前100个元素,以前是看不见的。此外,如果没有过滤器,排序应显示以A开头的前100个条目,再次排序应显示以Z开头的前100个条目

我所尝试的:

  • 将getRowCount返回的值限制为模型中的值
    k
    。这不起作用,因为它对原始
    k
    值进行排序/过滤
  • 我试图编写一个只接受first
    k
    项的自定义过滤器。这不起作用,因为过滤器在排序前应用了一次,我不知道如何在排序后重新应用它
  • 通过渲染的单元格进行黑客攻击,使其不会渲染所有单元格。没有找到要求渲染器不执行任何操作的方法

  • 谢谢你的帮助

    不要弄乱渲染和表本身-问题在别处

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

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

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

    • 对于用户来说,看起来所有的数据都是可用的
    • 仅加载从模型请求的数据
    • 数据以异步方式快速加载,使得视图响应速度非常快
    • 排序和筛选在后端/存储库中完成,因此无需在客户端处理和丢弃大量数据
    • 与支持筛选、排序和分页的数据库和REST接口配合良好
    • 这就是JTables的实际使用方式(Modelas adapter,UI中的flyweight呈现模式)

    在渲染的单元格中进行黑客攻击,使其不会渲染所有单元格
    -表格将仅渲染视口中的单元格。问题是TableModel中所有数据的存储。谢谢您的建议!我希望重用代码而不是重构模型,但你是对的,你的方法可能更好。我已经开始编写一个实现。两条注释:1:我认为当设置了新的过滤器或排序条件时,需要刷新缓存。2:当表格显示时,它请求所有数据,而不仅仅是视口行,如@camickr所说。我遗漏了什么吗?1:是的,更改筛选器或排序必须刷新缓存,并使所有挂起的异步获取请求无效。您可以在表模型上使用版本计数器,并在异步加载页面时记住版本。更改筛选器或排序时增加版本,并放弃以前版本的加载页面。2:我刚刚测试了它,记录了请求的行,并且只记录了请求的当前视口的行,而不是所有行(即使在快速滚动时也不记录)。