3

我正在使用一个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...
}

如有必要,我可以在其中包含创建节点的代码,但我认为这不是问题。

4

2 回答 2

7

问题是它DefaultMutableTreeNode没有通知DefaultTreeModel它的子节点已更新。为此,您需要在表模型(nodesChanged或类似模型)中调用适当的方法,或者(最好)使用该DefaultTreeModel.insertNodesInto方法。

DefaultTreeModel model = (DefaultTreeModel)accessPointTree.getModel();
DefaultMutableTreeNode root = model.getRoot();
model.insertNodeInto(accessPointNode, root, root.getChildCount());
于 2011-07-26T14:40:24.620 回答
0

很可能您遇到了一些线程问题。您的 JTree 更新是某个线程,但 JTree 的重要副本,即在 Swing 事件调度线程 (EDT) 中显示的副本,对这些更改一无所知。

如果是这种情况,您必须使用以下命令更新 Swing EDT 中的 JTree:

SwingUtilities.invokeLater(new Runnable() {
  @Override public void run() { ... update jTree here }
});

我不知道 JTree……也许是您必须在 Swing EDT 中更新的 TreeModel。

于 2011-07-26T14:26:51.283 回答