如何在JTree中移动节点?

时间:2010-09-21 22:22:27

标签: java swing jtree

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

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

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

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

1 个答案:

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