编程语言
首页 > 编程语言> > java – 当TreeModel添加新节点时,为什么我的JTree不能更新?

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

作者:互联网

我使用的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...
}

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

解决方法:

问题是DefaultMutableTreeNode不通知DefaultTreeModel其子项已更新.为此,您要么想要在表模型中调用适当的方法(nodesChanged或类似),要么(最好)使用DefaultTreeModel.insertNodesInto方法.

DefaultTreeModel model = (DefaultTreeModel)accessPointTree.getModel();
DefaultMutableTreeNode root = model.getRoot();
model.insertNodeInto(accessPointNode, root, root.getChildCount());

标签:jtree,java,swing,treemodel
来源: https://codeday.me/bug/20190730/1577427.html