从 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
.
我有一个 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
.