SwingX 项目中的 JXTable
有一种方法可以直接在 RowFilter
上设置 JXTable
(请参阅 JXTable#setRowFilter
)。
我不清楚当过滤器实现是动态的时你需要做什么。
为了比较:在JDK中他们在JDK1.6中引入了 RowSorter
接口(interface),并且该接口(interface)允许附加一个 RowSorterListener
。如果您有动态 RowSorter
(也可用于过滤),则可以在过滤器更改时向这些监听器触发事件(尽管这要求过滤器有权访问 RowSorter
,因为不存在 DynamicRowFilter
或JDK 中的 RowFilterEvent
)。
我期望的是,我可以在 RowFilter
上设置一个“可观察的”JXTable
,并且我无需执行任何操作。但由于当前的 API 似乎不可能做到这一点,那么下一个最好的事情是什么?
- 每次更改时重新设置过滤器。这是否会产生效果,因为它与之前在
JXTable
上设置的实例完全相同? - 滥用表格事件并仅触发表格模型已更改的事件,这将重新触发排序/过滤
- 不要使用
setRowFilter
方法并创建您自己的TableRowSorter
并依靠 JDK API。
最佳答案
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
重复我的评论:RowFilter 必须是不可变的。当排序/过滤被引入核心时,这是一个有意识的设计决策。所以实现“动态”过滤的方法是
- 使您的自定义过滤器(不是 rowFilter)可观察
- 为该过滤器实现一个监听器,根据更改创建新的 RowFilter
- 将 rowFilter 设置为 xtable(在 SwingX 中)或 DefaultRowSorter(在核心中)
编辑
I don't agree with that design, but couldn't sway him
应该是:我不同意 - 同时,我不像以前那么确定;-)
这种方法的优点是 RowFilter 的实现非常小,并且可重用性很高 - 只是一个简单的谓词,没有其他任何东西。这允许过滤器的简单逻辑复合(和/或)。过滤器的一部分没有通知的负担,排序器(或复合过滤器)的一部分没有监听和更新自身的负担。然后考虑到过滤器更改的“动态”通常来自用户交互,并且无论如何某些东西必须监听这些用户触发器,创建一个新的 rowFilter 与更新一个 rowFilter 并不是什么大问题。现有的行过滤器。
关于java - 排序 Controller : how to use a dynamic filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13511083/