我有一个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显示的内容:
另一方面,如果我折叠主节点,它会正确清除所有内容(看起来只有当我折叠主节点时才会更新视觉效果)。 清除时,如何防止“脏”子节点停留在主节点上?
答案 0 :(得分:1)
您需要通知TreeModel
结构已更改。
无论出于何种原因(我假设它是一个优化选择),节点没有({1}}的(直接)连接,它们有点像两个模型一起工作,但是哪一个人不和另一个说话......是的,这很烦人
所以当你修改&#34;节点&#34;树,您需要通知TreeModel
,并会更新TreeModel
...
JTree
,则 DefaultTreeModel
有nodesWereRemoved方法供您使用。