2

我已经实现了一个 TreeModel 来适应现有的数据模型以作为 JTree 进行可视化。我遇到了具有多个相同子(叶)节点的节点的问题。例如,考虑一个带有叶节点的 JTree,这些叶节点是字符串。只要父节点包含具有相同字符串值的子节点,就会出现问题。这些叶节点的 TreePath 是相同的,并且作为字符串,equals() 返回 true。该文档明确指出了这一点:

JTree 及其相关类广泛使用 TreePaths 来识别 TreeModel 中的节点。如果 TreeModel 返回相同的对象,通过 equals 进行比较,则在同一父级下的两个不同索引处,生成的 TreePath 对象也将被视为相等。一些实现可能假设如果两个 TreePath 相等,则它们标识相同的节点。如果不满足此条件,可能会导致绘画问题和其他奇怪现象。换句话说,如果给定父级的 getChild 返回相同的 Object(由 equals 确定)可能会导致问题,建议您避免这样做。

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

编辑:我最终使用了建议的方法。我需要为我的应用程序支持相同字符串的多个实例作为同一父级的子级,但没有找到其他解决方法。它有效,但是...

4

1 回答 1

1

我的建议是创建 TreeNode 的子类,并覆盖方法 equals。(在 TreeNode 内保存字符串)。我认为有了这个你可以使用java的DefaultTreeModel。

于 2014-09-27T05:59:49.517 回答