代码之家  ›  专栏  ›  技术社区  ›  Momo

从DefaultMutableTreeNode递归移除子级不会在帧中正确更新

  •  0
  • Momo  · 技术社区  · 8 年前

    我有一个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 是主节点( DefaultMutableTreeNode )JTree的:

    DefaultMutableTreeNode projectViewTop = new DefaultMutableTreeNode("Project");
    

    这个 项目视图顶部 有几个子节点,也包含子节点(projectViewTop是“Project[My Project]”节点):

    enter image description here

    在某一点上,我需要清除每个孩子的 项目视图顶部 节点。我创建了这个方法来递归地清除它们:

    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 回复  |  直到 8 年前
        1
  •  1
  •   MadProgrammer    8 年前

    您需要通知 TreeModel 结构已经改变。

    无论出于什么原因(我假设这是一个优化选择),节点与 树模型 他们有点像两个模特在一起工作,但其中一个不跟另一个说话……是的,这很烦人

    因此,当您修改“节点”树时,需要通知 树模型 并将导致更新 JTree ...

    DefaultTreeModel 有一个 nodesWereRemoved 如果您使用 默认树模型 .