2014-09-27 2 views
0

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

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

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

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

+2

для лучшей помощи скорее отправить сообщение SSCCE/MCVE с жестким кодом для DefaultTreeModel в локальной переменной, тогда это должен быть хороший вопрос – mKorbel

+1

* «Я столкнулся с проблемой с узлами, которые имеют несколько идентичных дочерних (листовых) узлов. , рассмотрим JTree с листовыми узлами, которые являются строками ». * Почему они включают несколько одинаковых строк? И разве это не смущает пользователя? * «Какую из этих трех« Симпатичных картин котенка я хочу? »* –

+0

@ Андрю Томпсон Может быть, правда, что я злоупотребляю JTree - я открыт для других вариантов. Рассмотрим что-то вроде редактора плейлистов (это не то, что это, но близко). Разумно, даже желательно, добавить один и тот же трек в список воспроизведения более одного раза. Использование дерева позволяет сразу развернуть несколько «плейлистов», чтобы увидеть, какие «треки» используются в других «плейлистах». – ags

ответ

1

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