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(含)。