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