2

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

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

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

我所期望的是我可以设置一个“可观察的”RowFilter并且JXTable我什么都不用做。但由于当前的 API 似乎无法做到这一点,那么下一个最好的事情是什么?

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

1 回答 1

3

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

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

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

编辑

我不同意那个设计,但不能动摇他

应该是:我不同意- 同时,我不太确定;-)

这种方法的优点是 RowFilter 实现起来真的很小,而且可重用性很高——只是一个简单的谓词,没有别的。这允许过滤器的简单逻辑复合(和/或)。过滤器的一部分没有通知的负担,分类器(或复合过滤器)的一部分也没有监听和更新自身的负担。然后考虑到过滤器更改的“动态”通常来自用户交互,并且无论如何都必须听取这些用户触发器,创建新的rowFilter与更新现有的 rowFilter 没什么大不了的。

于 2012-11-22T11:56:41.133 回答