从 DefaultMutableTreeNode 中递归删除子节点不会在框架中正确更新

Removing children recursively from DefaultMutableTreeNode doesn't update in frame correctly

我有一个 JTree,projectView:

projectView = new JTree(projectViewTop);
projectView.setBackground(Color.WHITE);
projectView.setSize(250, getHeight());
projectView.setLocation(0, 0);
projectView.setVisible(true);
projectView.addKeyListener(this);
add(projectView);

其中projectViewTop是JTree的主节点(DefaultMutableTreeNode):

DefaultMutableTreeNode projectViewTop = new DefaultMutableTreeNode("Project");

projectViewTop 有几个子节点,其中也包含子子节点(projectViewTop 是 'Project [My project]' 节点):

有一次,我需要清除 projectViewTop 节点的每个子节点。我创建了这个方法来递归清除它们:

public void clearNode(DefaultMutableTreeNode node) {
    for (int i = 0; i < node.getChildCount(); i++) {
        DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt(i);
        clearNode(child);
    }
    node.removeAllChildren();
}

然而,当我运行这个方法时,内容并没有在视觉上被清除。这是 JTree 显示发生的情况:

另一方面,如果我折叠主节点,它会正确清除所有内容(似乎只有当我折叠主节点时视觉效果才会更新)。 清除时如何防止'dirt'个子节点留在主节点上?

您需要通知 TreeModel 结构已更改。

无论出于何种原因(我假设这是一个优化选择),节点与 TreeModel 没有(直接)连接,它们有点像两个模型一起工作,但其中一个不不和对方说话...是的,这很烦人

所以当你修改 "node" 树时,你需要通知 TreeModel 并且会导致更新 JTree ...

DefaultTreeModel 有一个 nodesWereRemoved 方法可以使用,如果你使用 DefaultTreeModel.