2010-09-21 70 views
4

我有一个扩展了DefaultTreeModel的自定义模型的JTree。我需要能够将节点从一个分支移动到另一个分支,而不会丢失选择。
目前,我正在做它在我的模型是这样的:如何在JTree中移动节点?

private void moveNode(MutableTreeNode node, MutableTreeNode newParent) { 
    super.removeNodeFromParent(node); 
    super.insertNodeInto(node, newParent, 0); 
} 

由于我使用的方法DefaultTreeModel的,节点到达正确的地方,树视图被更新,但它也失去了节点上的选择。这是有道理的,因为它(暂时)被删除,但这不是我想要的行为。

这样移动节点的正确方法是什么?移动后的选择应与移动之前的移动相同,无论移动后是否涉及重新选择节点。

回答

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事件。

+1

-1用于重新混合问题 – kleopatra 2012-02-16 13:06:17