2014-09-27 63 views
0

我实现了TreeModel以适应现有的可视化数据模型作为JTree。我遇到了具有多个相同子节点(叶)的节点的问题。例如,考虑具有作为字符串的叶节点的JTree。每当父节点包含具有相同字符串值的子项时,就会出现问题。这些叶节点的TreePath是相同的,而作为Strings,equals()返回true。该文档明确地呼吁:对具有相同子项的JTree节点的支持

JTree及其相关的类大量使用TreePaths为 确定TreeModel中的节点。如果一个TreeModel返回相同的 对象,相比之下等于,在相同的 父辈下的两个不同索引处的结果TreePath对象相当于 。某些实现可能会假设如果两个TreePath相等,则它们将标识相同的节点。如果不符合此条件,则可能会导致绘画问题和其他异常情况。换句话说,如果给定父项的getChild 返回相同的对象(由等于确定) 可能会导致问题,建议您避免这样做。

有没有办法解决这个问题?到目前为止我唯一想到的(理论上 - 我没有实现并验证它会工作)是将一个String包装到另一个类中,重写toString()以返回包装的字符串,并利用默认的equals()方法,它测试实际的包装器对象必须是相同的(相同的实例)才能返回true。这似乎是一个可怕的黑客。任何人?

编辑:我结束了使用提出的方法。我需要支持同一个字符串的多个实例作为我的应用程序的同一父级的子代,并且没有找到其他解决方法。它的工作原理,但...

+2

为更好地帮助在局部变量越早张贴SSCCE/MCVE用硬编码值DefaultTreeModel的,那么它应该是一个很好的问题 – mKorbel 2014-09-27 06:24:25

+1

*“我已经打了一个问题,即有多个相同的子(叶)节点的节点。例如,请考虑一个带有叶节点的JTree,它们是字符串。“*为什么它们包含多个相同的字符串?这不会让用户感到困惑吗? *“这三个'可爱的小猫图片中的哪一个我喜欢?”* – 2014-09-27 06:24:34

+0

@Andrew Thompson这可能是我滥用JTree的原因 - 我愿意接受其他选择。考虑像播放列表编辑器(这不是什么,但是关闭)。将同一曲目不止一次添加到播放列表是合理的,甚至是理想的。使用树可以一次扩展多个“播放列表”,以查看在其他“播放列表”中使用哪些“曲目”。 – ags 2014-09-27 15:04:22

回答

1

我的建议是创建一个TreeNode的子类,并重写equals方法。 (在TreeNode中保存你的字符串)。我想用这个你可以使用java的DefaultTreeModel。

相关问题