有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java SortController:如何使用动态过滤器

SwingX项目中的JXTable有一个方法可以直接在JXTable上设置RowFilter(请参见JXTable#setRowFilter

当过滤器实现是动态的时,我不清楚您需要做什么

比较:在JDK中,他们在JDK1中引入了^{}接口。6,此接口允许附加RowSorterListener。如果您有一个动态的RowSorter(也可以用于过滤),那么当过滤器更改时,您可以向这些侦听器触发事件(尽管这要求过滤器可以访问RowSorter,因为JDK中没有DynamicRowFilterRowFilterEvent

我所期望的是,我可以在JXTable上设置一个“可观察的”RowFilter,而我什么也不做。但是,目前的API似乎不可能做到这一点,那么下一个最好的方法是什么呢

  • 每次更改过滤器时,请再次设置过滤器。这是否会产生效果,因为它与之前在JXTable上设置的实例完全相同
  • 滥用表事件,仅触发表模型已更改的事件,这将重新触发排序/筛选
  • 不要使用setRowFilter方法,创建自己的TableRowSorter并使用JDKAPI

共 (1) 个答案

  1. # 1 楼答案

    The use-case we have is a filter (not a rowfilter) which can be changed to filter out elements of a model, and we have a RowFilter based on that dynamic filter to filter out those elements

    重复我的评论:行过滤器必须是不可变的。在core中引入排序/过滤时,这是一个简洁的设计决策。因此,实现“动态”过滤的方法是

    • 使自定义过滤器(而不是行过滤器)可见
    • 为过滤器实现一个侦听器,该侦听器在更改时创建一个新的行过滤器
    • 将rowFilter设置为xtable(在SwingX中)或DefaultRowSorter(在core中)

    编辑

    I don't agree with that design, but couldn't sway him

    应该是:我不同意,——同时,我也不像以前那样确定;——

    这种方法的优点是RowFilter实现起来非常简单,并且具有高度的可重用性——只是一个简单的谓词,其他什么都没有。这就允许对过滤器进行简单的逻辑复合(和/或)。过滤器无需通知,分拣机(或复合过滤器)无需监听和更新自身。然后,考虑到过滤器更改的“动态”通常来自用户交互,而且无论如何,有些东西必须倾听这些用户触发,创建新的行过滤器与更新现有的行过滤器并不是什么大问题