从DefaultMutableTreeNode递归删除子项不会正确更新帧

时间:2016-03-22 01:54:49

标签: java swing jtree

我有一个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]'节点):

enter image description here

有一次,我需要清除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显示的内容:

enter image description here

另一方面,如果我折叠主节点,它会正确清除所有内容(看起来只有当我折叠主节点时才会更新视觉效果)。 清除时,如何防止“脏”子节点停留在主节点上?

1 个答案:

答案 0 :(得分:1)

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

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

所以当你修改&#34;节点&#34;树,您需要通知TreeModel,并会更新TreeModel ...

如果您使用的是JTree,则

DefaultTreeModelnodesWereRemoved方法供您使用。