3

我正在使用 dom4j 从 dom4j 文档创建 DocumentTreeModel。

我在里面显示这个 DocumentTreeModel JScrollPane

我有一个向 dom4j 文档添加新节点并重新创建 DocumentTreeModel 的按钮

我正在使用 getPathForRow 但这似乎非常有限。我需要能够处理多个树深度。基本上在寻找类似的东西tree.getPathOfLastModifiedChildrensParent()

onAddNewNodeButtonClickEventFired {
   dom4jdocument.addElement( "1" );                               
   tree.setModel(new DocumentTreeModel(dom4jdocument));                                
   tree.expandPath(tree.getPathForRow(1));                             
}  

基本上,我试图在Jtree每次编辑文档时重新绘制文档。

4

2 回答 2

3

每当您编辑文档时看到您设置新模型看起来您仍然没有运行通知,对吗?如果是这样,您不需要在 JTree 上使用任何特殊方法 - 您需要的是 TreeModel 的良好实现;-)

只是为了好玩,我查看了 DocumentTreeModel:这是在 DefaultTreeModel 之上的一个非常小的封面,不支持将 Document 中的更改粘合到 DocumentTreeModel 中的更改。Leaf-/BranchTreeNode 仅实现 TreeNode(而不是更进一步并实现 MutableTreeNode)这一事实甚至禁用了模型辅助方法来插入/删除节点。短篇小说:所有的辛勤工作都留给你。

基本上,您必须让 treeModel 了解基础文档中的任何更改。类似(伪代码):

 DocNode newElement = document.addElement(...)
 DocNode parentElement = newElement.getParent();
 // walk the tree until you find the TreeNode which represents the DocNode
 BranchTreeNode root = treeModel.getRoot();
 BranchTreeNode parentNode = null;
 forEach (root.child)
     if child.getXMLNode().equals(parentElement)
          parentNode = child;
 // now find the childNode which corresponds to the new element
 forEach (parentNode.child)
    if (parentNode.child.getXMLNode().equals(newElement)
         childNode = child;
 // now notify the treeModel that an insertion has happened
 treeModel.nodesWhereInserted(parentNode, childNode ...)

嗯......在你的鞋子里,我会寻找一个更舒适的实现,不能相信在某个地方还有另一个实现?

铜珍妮特

于 2011-04-08T10:46:24.273 回答
1

尝试 - tree.revalidate(); 它应该刷新组件树。

于 2011-04-07T17:45:23.087 回答