java - 如何移动 JTree 中的节点?

标签 java swing jtree

我有一个带有自定义模型的 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/

相关文章:

java - new Date().getTime() 不以毫秒为单位返回时间戳

Java:右键单击文本字段上的复制剪切粘贴

java - 在 JTree 中获取属性 XML

java - JTree setSelectionPaths 展开时间太长

java - 在 RecyclerView 中添加日期部分

java - java中使用runnable接口(interface)实现线程

java - 如何在 JTextArea 中添加垂直和水平滚动条以查看完整文件 - JAVA

java - JLabel.setText() 仅为循环中的最后一个元素设置文本

java - 使用 JCheckBox 帮助制作 JTree

java - 解析 JSON 并将其作为自定义对象列表写入首选项