【问题标题】:How do you move nodes in a JTree?如何移动 JTree 中的节点?
【发布时间】:2011-04-15 11:06:57
【问题描述】:

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

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

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

像这样移动节点的正确方法是什么?移动后的选择应该和移动前一样,无论是否涉及在移动后重新选择节点。

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    您有两个选项可供选择,第一个是滚动您自己的 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 事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2015-07-23
      • 2012-02-22
      • 1970-01-01
      • 2011-08-06
      • 2017-05-05
      相关资源
      最近更新 更多