SortController:如何使用动态过滤器

时间:2012-11-22 10:49:35

标签: java swing swingx jxtable

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

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

比较:在JDK中,他们在JDK1.6中引入了RowSorter接口,并且此接口允许附加RowSorterListener。如果您有动态RowSorter(也可用于过滤),则可以在过滤器更改时向这些侦听器触发事件​​(尽管这要求过滤器可以访问RowSorter不是JDK中的DynamicRowFilterRowFilterEvent

我期望的是我可以在RowFilter上设置“可观察的”JXTable并且我不得不做任何事情。但是,由于目前的API似乎无法做到这一点,下一个最好的事情是什么呢?

  • 每次更改时再次设置过滤器。这是否会产生影响,因为它与先前在JXTable上设置的实例完全相同?
  • 滥用表格事件,只是触发表格模型已更改的事件,这将重新触发排序/过滤
  • 不要使用setRowFilter方法并创建自己的TableRowSorter并重新使用JDK API。

1 个答案:

答案 0 :(得分:3)

  

我们使用的用例是一个过滤器(不是行过滤器)可以更改为过滤掉模型的元素,我们有一个基于该动态过滤器的RowFilter来过滤掉这些元素

重复我的评论:RowFilter必须是不可变的。当排序/过滤被引入核心时,这是一个有意义的设计决策。因此实现“动态”过滤的方法是

  • 使您的自定义过滤器(不是rowFilter)可观察
  • 为该过滤器实现一个侦听器,该过滤器在更改时创建一个新的RowFilter
  • 将rowFilter设置为xtable(在SwingX中)或DefaultRowSorter(在核心中)

修改

  

我不同意这种设计,但不能动摇他

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

这种方法的优点是RowFilter实际上是一个很小的硬币实现和高度可重用 - 只是一个简单的谓词,没有别的。这允许简单的逻辑复合(和/或)滤波器。没有负担通知部分过滤器,分拣机(或复合过滤器)的一部分没有负担来监听和更新自身。然后考虑到过滤器更改的“动态”通常来自用户交互,某些东西必须听取这些用户触发器,创建新的rowFilter与更新一个并不是什么大不了的事。现有的rowFilter。