【发布时间】:2014-11-22 03:55:12
【问题描述】:
我已经实现了一个 TreeModel 来适应现有的数据模型,以便将其可视化为 JTree。我遇到了具有多个相同子(叶)节点的节点的问题。例如,考虑一个带有叶节点的 JTree,这些叶节点是字符串。只要父节点包含具有相同字符串值的子节点,就会出现问题。这些叶节点的 TreePath 是相同的,并且作为字符串,equals() 返回 true。文档明确指出了这一点:
JTree 及其相关类广泛使用 TreePaths 识别 TreeModel 中的节点。如果 TreeModel 返回相同的 对象,通过 equals 比较,在相同的两个不同索引处 父级而不是生成的 TreePath 对象将被视为等于 好吧。一些实现可能假设如果两个 TreePath 相等, 它们标识相同的节点。如果不满足这个条件,画 可能会导致问题和其他异常情况。换句话说,如果 getChild 对于给定的父级返回相同的对象(由等于确定) 可能会导致问题,建议您避免这样做。
有没有办法解决这个问题?到目前为止,我唯一想到的(理论上 - 我还没有实现并验证它是否可以工作)是将 String 包装在另一个类中,覆盖 toString() 以返回包装的字符串,并利用默认的 equals() 方法测试实际的包装对象必须相同(相同的实例)才能返回 true。这似乎是一个可怕的黑客攻击。有人吗?
编辑:我最终使用了建议的方法。我需要为我的应用程序支持相同字符串的多个实例作为同一父级的子级,但没有找到其他解决方法。它有效,但是...
【问题讨论】:
-
为了获得更好的帮助,请尽快在局部变量中发布带有 DefaultTreeModel 硬编码值的 SSCCE/MCVE,那么这应该是一个很好的问题
-
“我遇到了具有多个相同子(叶)节点的节点的问题。例如,考虑一个具有字符串叶节点的 JTree。”包括多个相同的字符串?这不会让用户感到困惑吗? “我想要这三个
Cute Kitten Picture中的哪一个?” -
@Andrew Thompson 我滥用 JTree 可能是真的——我对其他选择持开放态度。考虑播放列表编辑器之类的东西(不是这样,但很接近)。将同一曲目多次添加到播放列表是合理的,甚至是可取的。使用树允许一次扩展多个“播放列表”,以查看其他“播放列表”中使用了哪些“曲目”。