使用自定义TreeCellRenderer(Java,Swing)在JTree中拖放反馈

3 java swing drag-and-drop jtree

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

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

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

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

小智 8

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

答案就在这里:在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
 }
Run Code Online (Sandbox Code Playgroud)

上面的代码应该添加到getTreeCellRendererComponent()方法中.