我有一个带有自定义模型的 JTree,它扩展了 DefaultTreeModel。我需要能够在不丢失选择的情况下将节点从一个分支移动到另一个分支。
目前,我在我的模型中这样做:
private void moveNode( MutableTreeNode node, MutableTreeNode newParent ) {
super.removeNodeFromParent( node );
super.insertNodeInto( node, newParent, 0 );
}
因为我使用的是 DefaultTreeModel 方法,节点到达正确的位置并且 TreeView 得到更新,但它也失去了节点上的选择。这是有道理的,因为它正在(暂时)被删除,但这不是我想要的行为。
像这样移动节点的正确方法是什么?移动后的选择应该与移动前相同,无论移动后是否重新选择节点。
最佳答案
您有两个选项可供选择,第一个是滚动您自己的 JTree
子类,大致如下所示:
public class MyTree extends JTree {
public MyTree() {
final MyTreeModel m = new MyTreeModel()
super.setTreeModel(m);
super.setSelectionModel(m.getSelectionModel());
}
/**
* your tree model implementation which fiddles
* with sm when "move" is called
*/
private class MyTreeModel implements TreeModel() {
private final DefaultTreeSelectionModel sm;
public MyTreeModel() {
this.sm = new DefaultTreeSelectionModel();
}
public TreeSelectionModel getSelectionModel() { return this.sm; }
}
}
这样您就可以在需要时随时使用选择模型,并且可以在 move
方法中对其进行修改。
另一方面,类似的功能已经存在于拖放支持中,并且支持 DnD 的样板相当可观但易于管理(另外,您在树中获得 DnD 支持)。问题是我不知道如何以编程方式触发 DnD 事件。
关于java - 如何移动 JTree 中的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3764943/