Problem
对 a 应用过滤JTree
以避免某些节点/叶子出现在渲染版本中JTree
。理想情况下,我正在寻找一种允许动态过滤器的解决方案,但如果我能让静态过滤器工作,我会很高兴。
为了让事情变得更容易一点,让我们假设JTree
只支持渲染,不支持编辑。移动、添加、删除节点应该是可能的。
一个例子是上面的搜索字段JTree
,然后输入JTree
只会显示匹配的子树。
有一些限制:它只能在可以访问 JDK 和 SwingX 的项目中使用。我想避免包含其他第三方库。
我已经想到了一些可能的解决方案,但这些似乎都不理想
方法
基于模型的过滤
- 装饰
TreeModel
过滤掉一些值。快速而肮脏的版本很容易编写。过滤掉节点,并在过滤器或委托的每次更改时TreeModel
装饰器可以触发整个树发生变化的事件(treeStructureChanged
以根节点为节点)。将此与恢复选择状态和扩展状态的侦听器结合起来JTree
你会得到一个或多或少有效的版本,但是源自的事件TreeModel
都搞砸了。这或多或少是使用的方法这个问题 https://stackoverflow.com/questions/831813/hiding-filtering-nodes-in-a-jtree
- 装饰
TreeModel
但尝试触发正确的事件。我(还)没有想出一个可行的版本。似乎需要委托的副本TreeModel
为了能够在从委托模型中删除节点时使用正确的子索引触发事件。我认为再花一些时间我就可以让它发挥作用,但感觉不对(过滤感觉像是视图应该做的事情,而不是模型应该做的事情)
- 装饰用于创建初始的任何数据结构
TreeModel
。然而,这是完全不可重用的,并且可能和为一个对象编写一个装饰器一样困难。TreeModel
基于视图的过滤
这似乎是可行的方法。过滤不应影响模型,而应仅影响视图。
-
我看了一下RowFilter http://docs.oracle.com/javase/7/docs/api/javax/swing/RowFilter.html班级。尽管 javadoc 似乎建议您可以将它与JTree
:
当与 JTree 关联时,条目对应于一个节点。
我找不到之间的任何链接RowFilter
(or RowSorter http://docs.oracle.com/javase/7/docs/api/javax/swing/RowSorter.html)和JTree
班级。标准的实施RowFilter
Swing 教程似乎表明RowFilter
只能直接使用JTable
(see JTable#setRowSorter http://docs.oracle.com/javase/7/docs/api/javax/swing/JTable.html#setRowSorter(javax.swing.RowSorter))。没有类似的方法可用JTree
- 我还看了JXTree http://www.jarvana.com/jarvana/view/org/swinglabs/swingx/1.6.1/swingx-1.6.1-javadoc.jar!/org/jdesktop/swingx/JXTree.htmljavadoc。它有一个ComponentAdapter http://www.jarvana.com/jarvana/view/org/swinglabs/swingx/1.6.1/swingx-1.6.1-javadoc.jar!/org/jdesktop/swingx/decorator/ComponentAdapter.html可用和javadoc
ComponentAdapter
表示一个RowFilter
可以与目标组件交互,但我不知道如何在目标组件之间建立链接RowFilter
和JTree
- 我还没看过如何
JTable
处理过滤RowFilter
s,也许同样可以在 a 的修改版本上完成JTree
.
简而言之:我不知道解决这个问题的最佳方法是什么
注意:这个问题可能是重复的这个问题 https://stackoverflow.com/questions/831813/hiding-filtering-nodes-in-a-jtree,但这个问题仍然没有答案,问题相当短,答案似乎不完整,所以我想发布一个新问题。如果不这样做(常见问题解答没有对此提供明确的答案)我将更新这个 3 年前的问题
看看这个实现:http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm
它创建 DefaultMutableNode 的子类,添加“isVisible”属性,而不是实际从 TreeModel 中删除/添加节点。我认为非常好,它巧妙地解决了我的过滤问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)