基于JTree的二叉排序树删除带孩子节点与路径展开问题咨询
带子孙节点的删除逻辑修复
DefaultMutableTreeNode的removeFromParent()方法默认仅移除当前节点与父节点的关联,当前节点持有的所有子节点会被一同移除,需先完成子节点迁移再删除原节点,正确实现逻辑如下:
- 先获取待删除节点的父节点与对应索引
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) node.getParent(); int delPos = parent.getIndex(node);
- 倒序遍历待删除节点的所有子节点,逐个迁移到父节点的对应位置(倒序遍历可避免子节点索引错乱)
for (int i = node.getChildCount() - 1; i >= 0; i--) { DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i); node.remove(child); parent.insert(child, delPos); }
- 移除已无子孙的待删除节点,最后通知树模型结构变更
node.removeFromParent(); ((DefaultTreeModel) jtree.getModel()).nodeStructureChanged(parent);
根节点到指定节点路径展开实现
jtree.updateUI()是UI外观更新接口,model.reload()会重置整树状态,二者均不用于节点展开操作,正确实现如下:
- 构造目标节点的全路径TreePath对象
TreePath targetPath = new TreePath(targetNode.getPath());
- 调用JTree原生展开方法,若需要滚动到节点可见位置可补充滚动方法
// 展开全路径 jtree.expandPath(targetPath); // 滚动到节点可见区域 jtree.scrollPathToVisible(targetPath);
- 若界面仍无刷新,仅需触发目标节点的变更通知即可,无需全量重载模型
((DefaultTreeModel) jtree.getModel()).nodeChanged(targetNode);
内容的提问来源于stack exchange,提问作者杨小林
相关产品推荐
相关产品推荐

