当TreeModel添加新节点时,为什么我的JTree不会更新?

Cal*_*son 3 java swing jtree treemodel

我使用DefaultTreeModel填充的覆盖DefaultMutableTreeNode,支持可选地更改树中节点的显示字符串.如下面的代码所示,在我的表单中,我通过在一个单独的类中创建它们,然后通过我的主数据类型的包装类传递它们,用新节点填充树.其中的过程是创建一个新的重写DefaultMutableTreeNode,向其添加子项(每个AccessPoint子项由具有多个子节点的节点表示),然后将其存储以供以后在UI中使用.

我第一次以这种方式添加节点,它工作得很漂亮.添加了以下代码的任何后续节点实际上都存储在DefaultTreeModel,但未JTree使用新节点进行更新.

为什么JTree在添加第一个孩子后没有填充?

private void populateAccessPointTreeModel(AccessPointDataWrapper wrapper) {
    //the pre-created DefaultMutableTreeNode subclass instance is
    // stored in the wrapper
    DefaultMutableTreeNode accessPointNode =
            wrapper.getAccessPointTreeNode();
    //this line updates the accessPointTree with the new node (I've looked at the
    // value in debug mode, and it does in fact add the node
    ((DefaultMutableTreeNode) accessPointTree.getRoot()).add(accessPointNode);
    //unrelated logic happens down here...
}
Run Code Online (Sandbox Code Playgroud)

我可以在必要时包含我创建节点的代码,但我不认为这是问题.

小智 7

问题是DefaultMutableTreeNode没有告知DefaultTreeModel其子女的更新.要做到这一点,你要么想要在表模型(nodesChanged或类似)中调用适当的方法,或者(最好)使用该DefaultTreeModel.insertNodesInto方法.

DefaultTreeModel model = (DefaultTreeModel)accessPointTree.getModel();
DefaultMutableTreeNode root = model.getRoot();
model.insertNodeInto(accessPointNode, root, root.getChildCount());
Run Code Online (Sandbox Code Playgroud)