Перетащите отзыв в JTree с помощью собственного TreeCellRenderer (Java, Swing) - PullRequest
3 голосов
/ 07 августа 2009

У меня есть класс, производный от JTree с пользовательскими TreeCellRenderers. Я реализовал перетаскивание в этом дереве, чтобы пользователь мог переставлять узлы дерева.

Режим отбрасывания DropMode.ON_OR_INSERT, поэтому пользователь может отбрасывать узлы на других узлах или между ними. Когда пользователь перетаскивает узел, если указатель указывает между узлами, рисуется синяя линия, указывающая место, где будет вставлен узел. Если указатель находится на узле, нет указания на то, куда будет добавлен узел. Это происходит только тогда, когда я использую свой собственный TreeCellRenderer. Если я использую DefaultTreeCellRenderer, узел перетаскивания будет выделен во время перетаскивания.

Я нашел несколько примеров в Интернете, где люди хранят узел, который в данный момент выделен в JTree, и запрашивают его у TreeCellRenderer, отображая узел другим цветом, если TreeCellRenderer вызывается для узла, который должен быть выделен .

Есть ли более элегантное решение для выделения узла отбрасывания? Мне не удалось выяснить, как DefaultTreeRenderer делает это - кажется, нет никаких зацепок для перетаскивания функциональности.

1 Ответ

8 голосов
/ 21 августа 2009

Я понял это, так что на случай, если кому-то все равно:

Ответ прямо здесь: в javadoc для TreeCellRenderer

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

 JTree.DropLocation dropLocation = tree.getDropLocation();
 if (dropLocation != null
         && dropLocation.getChildIndex() == -1
         && tree.getRowForPath(dropLocation.getPath()) == row) {

     // this row represents the current drop location
     // so render it specially, perhaps with a different color
 }

Код выше должен быть добавлен в метод getTreeCellRendererComponent ().

...