Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不是';树模型添加新节点时是否更新我的JTree?_Java_Swing_Jtree_Treemodel - Fatal编程技术网

Java 为什么不是';树模型添加新节点时是否更新我的JTree?

Java 为什么不是';树模型添加新节点时是否更新我的JTree?,java,swing,jtree,treemodel,Java,Swing,Jtree,Treemodel,我正在使用一个DefaultTreeModel填充了DefaultMutableTreeNode的覆盖,它支持可选地更改树中节点的显示字符串。如下面的代码所示,在我的表单中,我通过在一个单独的类中创建新节点,然后通过主数据类型的包装类将它们传递给树,从而用新节点填充树。这里的过程是创建一个新的重写的DefaultMutableTreeNode,向其中添加子节点(每个AccessPoint由一个具有多个子节点的节点表示),然后将其存储在UI中供以后使用 我第一次以这种方式添加节点时,它工作得非常出

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

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

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

如果是这种情况,则必须使用以下方法更新Swing EDT中的JTree:

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

我不知道JTree的事。。。可能是您必须在Swing EDT中更新的树模型。

问题在于
DefaultMutableTreeNode
没有通知
DefaultTreeModel
其子级已更新。为此,您可以在表模型中调用适当的方法(
nodesChanged
或类似方法),或者(最好)使用
DefaultTreeModel.insertNodesInto
方法

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

您是否尝试重新绘制组件或其父组件?+1,对Swing组件的更新应始终使用模型完成。这很有意义。我之前一直在通过保存在UI类中的DefaultTreeModel进行更新,我只是使用了DefaultMutableTreeNode插件,因为它比较短。谢谢。我相信root.getChildCount()会在insertNodeInto上抛出越界异常(我的意思是我根据经验知道)。线程“算法线程”java.lang.ArrayIndexOutOfBoundsException中的异常:javax.swing.tree.DefaultMutableTreeNode.insert中的java.util.Vector.insertElementAt(Vector.java:571)在javax.swing.tree.DefaultTreeModel.insertNodeInto(DefaultTreeModel.java:234)中的1>0确保您使用的是实际计数,而不是计数+1或任何东西
Vector.insertElementAt
允许索引的范围为0..size(含)。