我有一个带有自定义模型的JTree,它扩展了DefaultTreeModel。我需要能够将节点从一个分支移动到另一个分支而不会丢失选择 目前,我正在我的模型中这样做:
private void moveNode( MutableTreeNode node, MutableTreeNode newParent ) {
super.removeNodeFromParent( node );
super.insertNodeInto( node, newParent, 0 );
}
由于我正在使用DefaultTreeModel方法,因此节点到达正确的位置并且树视图会更新,但它也会丢失节点上的选择。这是有道理的,因为它被(暂时)删除但不是我想要的行为。
移动这样的节点的正确方法是什么?移动后的选择应与移动前的选择相同,无论是否涉及移动节点后重新选择节点。
答案 0 :(得分:4)
您有两个选项可供选择,第一个是推送您自己的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事件。