Поддержка узлов JTree с идентичными дочерними элементами

Я реализовал TreeModel, чтобы адаптировать существующую модель данных для визуализации в виде JTree. У меня возникла проблема с узлами, у которых есть несколько идентичных дочерних (листовых) узлов. Например, рассмотрим JTree с конечными узлами, которые являются строками. Возникает проблема всякий раз, когда родительский узел содержит дочерние элементы с одинаковым значением String. TreePath к этим конечным узлам идентичен, и, как и для строк, equals() возвращает true. Документация вызывает это явно:

JTree и связанные с ним классы широко используют TreePaths для идентификации узлов в TreeModel. Если TreeModel возвращает один и тот же объект, сравниваемый с равными, с двумя разными индексами под одним и тем же родителем, результирующие объекты TreePath также будут считаться равными. Некоторые реализации могут предполагать, что если два TreePath равны, они идентифицируют один и тот же узел. При несоблюдении этого условия возможны проблемы с покраской и прочие странности. Другими словами, если getChild для данного родителя возвращает один и тот же объект (как определено равными), могут возникнуть проблемы, и рекомендуется избегать этого.

Это можно обойти? Единственное, что я придумал до сих пор (теоретически - я не реализовал и не проверил, что это будет работать), - это обернуть String в другой класс, переопределить toString(), чтобы вернуть обернутую строку, и воспользоваться преимуществом метод по умолчанию equals(), который проверяет, что фактические объекты-оболочки должны быть идентичными (один и тот же экземпляр), чтобы вернуть значение true. Это похоже на ужасный взлом. Кто-нибудь?

Изменить: в итоге я использовал предложенный метод. Мне нужно поддерживать несколько экземпляров одной и той же строки в качестве дочерних элементов одного и того же родителя для моего приложения, и я не нашел другого обходного пути. Это работает, но...


person ags    schedule 27.09.2014    source источник
comment
для лучшей помощи скорее опубликуйте SSCCE/MCVE с жестко закодированным значением для DefaultTreeModel в локальной переменной, тогда это должен быть хороший вопрос   -  person mKorbel    schedule 27.09.2014
comment
У меня возникла проблема с узлами, имеющими несколько идентичных дочерних (конечных) узлов. Например, рассмотрим JTree с конечными узлами, которые являются строками. Почему они включают несколько идентичных строк? И не будет ли это смущать пользователя? Какие из этих трех Cute Kitten Picture мне нужны?   -  person Andrew Thompson    schedule 27.09.2014
comment
@ Эндрю Томпсон Возможно, я злоупотребляю JTree - я открыт для других вариантов. Рассмотрим что-то вроде редактора плейлистов (это не то, что есть, но близко). Разумно и даже желательно добавлять один и тот же трек в список воспроизведения более одного раза. Использование дерева позволяет развернуть сразу несколько списков воспроизведения, чтобы увидеть, какие треки используются в других списках воспроизведения.   -  person ags    schedule 27.09.2014


Ответы (1)


Мой совет — создать подкласс TreeNode и переопределить метод equals. (Внутри TreeNode вы сохраняете свою строку). И я думаю, что с этим вы можете использовать DefaultTreeModel java.

person Alexander Campos    schedule 27.09.2014