Поддержка узлов JTree с одинаковыми дочерними элементами
Я реализовал TreeModel, чтобы адаптировать существующую модель данных для визуализации в виде JTree. Я столкнулся с проблемой с узлами, которые имеют несколько идентичных дочерних (конечных) узлов. Например, рассмотрим JTree с конечными узлами, которые являются строками. Существует проблема, когда родительский узел содержит дочерние элементы с одинаковым значением String. TreePath для этих конечных узлов идентичен, и как Strings, equals() возвращает true. В документации это явно выражено:
JTree и связанные с ним классы широко используют TreePath для идентификации узлов в TreeModel. Если TreeModel возвращает один и тот же объект, по сравнению с равными, при двух разных индексах под одним и тем же родителем, чем результирующие объекты TreePath также будут считаться равными. Некоторые реализации могут предполагать, что если два TreePath равны, они идентифицируют один и тот же узел. Если это условие не выполняется, могут возникнуть проблемы с окраской и другие странности. Другими словами, если getChild для данного родителя возвращает тот же объект (как определено равными), могут возникнуть проблемы, и рекомендуется избегать этого.
Это можно обойти? Единственное, что я до сих пор придумал (теоретически - я не реализовал и не проверил, что это будет работать) - это обернуть строку в другой класс, переопределить toString(), чтобы вернуть обернутую строку, и воспользоваться преимуществами Метод equals () по умолчанию, который проверяет, что фактические объекты-обертки должны быть идентичны (один и тот же экземпляр), чтобы вернуть true Это похоже на ужасный взлом. Кто-нибудь?
Изменить: я в конечном итоге, используя предложенный метод. Мне нужно поддерживать несколько экземпляров одной и той же строки в качестве дочерних элементов одного и того же родителя для моего приложения, и не нашел другого обходного пути. Это работает, но...
1 ответ
Мой совет - создать подкласс TreeNode и переопределить метод equals. (Внутри TreeNode вы сохраняете свою строку). И я думаю, что с этим вы можете использовать DefaultTreeModel из Java.