Java: getRowForLocation() возвращает разные строки int, когда Jtree имеет расширенные узлы или свернутые узлы

JTree jtree к нему подключен прослушиватель мыши. Когда пользователь щелкает узел компонента Jtree, я получаю целое число строк через

 jtree.getRowForLocation(evt.getX(), evt.getY());

проблема в том, что целое число возвращаемой строки отличается, когда есть узлы jtree, которые расширены, и когда они свернуты.

Мне нужен способ каким-то образом получить уникальный и абсолютный идентификатор каждого щелкнутого узла jtree, чтобы не было путаницы.

Есть ли способ добавить данные в компонент Jtree?

В противном случае мне нужен способ слушать, когда узлы расширяются, и пересчитывать строку, возвращаемую из этой функции выше....


person KJW    schedule 28.05.2011    source источник


Ответы (2)


В вашем текущем подходе вы полагаетесь на состояние древовидного представления для идентификации узла. Однако, как вы узнали, состояние представления может меняться. Что не меняется, так это древовидная модель, лежащая в основе представления.

Если вам нужен уникальный идентификатор для каждого узла, вы должны добавить его непосредственно к каждому узлу дерева в вашей модели дерева. Затем в прослушивателе мыши вы можете обнаружить узел, на который вы нажали, и получить доступ к его уникальному идентификатору.

person Mark    schedule 28.05.2011
comment
как я могу напрямую добавить уникальный идентификатор непосредственно к каждому узлу дерева? Сам узел дерева генерируется из файла xml, из которого создается модель дерева. Эта древовидная модель затем визуализируется в Jtree. - person KJW; 29.05.2011
comment
Можете ли вы добавить уникальные идентификаторы в исходный файл XML? Или после того, как модель дерева будет создана, вы можете пройтись по ней и установить уникальные идентификаторы на каждом узле? - person Mark; 29.05.2011
comment
Я добавил уникальный идентификатор в исходный XML-файл. Вы имеете в виду добавить слушателя модели в модель дерева? - person KJW; 29.05.2011
comment
И последний вопрос: можно ли преобразовать модель дерева в XML-файл? - person KJW; 29.05.2011

Пути однозначно идентифицируют узлы, поэтому getPathForLocation даст вам путь, но это объект TreePath, поэтому, если вам нужно, чтобы целое число представляло идентификатор, вам нужно было бы написать метод, который переводит TreePaths в целые числа.

person trutheality    schedule 28.05.2011
comment
Вы имеете в виду взять путь дерева и создать из него уникальный идентификатор? - person KJW; 29.05.2011
comment
Да, если вам действительно нужны целые идентификаторы. Но поскольку вы получаете прямой доступ к элементам дерева с помощью TreePath.getLastPathComponent(), вам может не понадобиться использовать идентификаторы, в зависимости от того, что вы хотите делать с узлами. - person trutheality; 29.05.2011
comment
Я использовал findComponentAt(x,y), чтобы найти компонент.... какой уникальный идентификатор? Вы имеете в виду свойство flags компонента узла jtree? - person KJW; 29.05.2011
comment
Уникальность хэш-кода не гарантируется — он просто спроектирован таким образом, чтобы он вряд ли был одинаковым для разных объектов. Безопасное решение состоит в том, чтобы пройтись по дереву и присвоить номер каждому элементу (либо путем редактирования компонентов, либо с помощью некоторой вспомогательной структуры данных, такой как карта). - person trutheality; 29.05.2011