Я реализовал TreeModel, чтобы адаптировать существующую модель данных для визуализации в виде JTree. У меня возникла проблема с узлами, у которых есть несколько идентичных дочерних (листовых) узлов. Например, рассмотрим JTree с конечными узлами, которые являются строками. Возникает проблема всякий раз, когда родительский узел содержит дочерние элементы с одинаковым значением String. TreePath к этим конечным узлам идентичен, и, как и для строк, equals() возвращает true. Документация вызывает это явно:
JTree и связанные с ним классы широко используют TreePaths для идентификации узлов в TreeModel. Если TreeModel возвращает один и тот же объект, сравниваемый с равными, с двумя разными индексами под одним и тем же родителем, результирующие объекты TreePath также будут считаться равными. Некоторые реализации могут предполагать, что если два TreePath равны, они идентифицируют один и тот же узел. При несоблюдении этого условия возможны проблемы с покраской и прочие странности. Другими словами, если getChild для данного родителя возвращает один и тот же объект (как определено равными), могут возникнуть проблемы, и рекомендуется избегать этого.
Это можно обойти? Единственное, что я придумал до сих пор (теоретически - я не реализовал и не проверил, что это будет работать), - это обернуть String в другой класс, переопределить toString(), чтобы вернуть обернутую строку, и воспользоваться преимуществом метод по умолчанию equals(), который проверяет, что фактические объекты-оболочки должны быть идентичными (один и тот же экземпляр), чтобы вернуть значение true. Это похоже на ужасный взлом. Кто-нибудь?
Изменить: в итоге я использовал предложенный метод. Мне нужно поддерживать несколько экземпляров одной и той же строки в качестве дочерних элементов одного и того же родителя для моего приложения, и я не нашел другого обходного пути. Это работает, но...
Cute Kitten Picture
мне нужны? - person Andrew Thompson   schedule 27.09.2014