3

我有一个从带有自定义 TreeCellRenderers 的 JTree 派生的类。我已经在该树中实现了拖放,因此用户可以重新排列树节点。

删除模式是DropMode.ON_OR_INSERT,因此用户可以在其他节点上或其他节点之间删除节点。当用户拖动节点时,如果指针指向节点之间,则会绘制一条蓝线,指示将插入节点的位置。如果指针位于节点上,则不指示将添加节点的位置。这只发生在我使用自定义 TreeCellRenderer 时。如果我使用 DefaultTreeCellRenderer,则拖放节点会在拖动过程中突出显示。

我在网上找到了一些示例,人们在其中存储当前在 JTree 中突出显示的节点并从 TreeCellRenderer 查询它,如果为应该突出显示的节点调用 TreeCellRenderer,则以不同的颜色呈现节点。

是否有更优雅的解决方案来突出显示放置节点?我还没有弄清楚 DefaultTreeRenderer 是如何做到这一点的——它似乎没有钩子来拖放功能。

4

1 回答 1

9

我想通了,所以以防万一有人关心:

答案就在这里:在 TreeCellRenderer 的 javadoc 中

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() 方法中。

于 2009-08-21T10:51:20.133 回答