java - 排序 Controller : how to use a dynamic filter

标签 java swing swingx jxtable

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/

相关文章:

java - SpringBoot 2 事务传播嵌套不支持

java - java多线程中的wait函数

java - AssertJ Swing - 杀死所有装置

java - 如何删除 Java Swing 中的行?

java - 从大量条目中实现选择框的最佳方法

java - 结合 JXTable 和 RXTable

java - 在java中干扰Keylistener

java - 不常见的数学图书馆可以信任吗?

java - 使用多个常量字段

java - 嵌套 if(e.getActionCommand().equals ("")