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

我在JScrollPane中显示此DocumentTreeModel。

我有一个按钮,它将一个新节点添加到dom4j文档中,并重新创建DocumentTreeModel

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

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

基本上,我每次尝试编辑文档时都尝试获取Jtree重绘文档。

最佳答案

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

只是为了好玩,我抬头看了DocumentTreeModel:这是DefaultTreeModel的一个极小的封面,不支持将Document中的更改与DocumentTreeModel中的更改相结合。 Leaf- / BranchTreeNode仅实现TreeNode的事实(与更进一步并实现MutableTreeNode相反)甚至禁用了模型助手方法来插入/删除节点。简短的故事:所有的辛苦工作都留给您。

基本上,您必须使treeModel知道基础Document中的任何更改。类似于(伪代码):

 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 ...)

嗯...在您的鞋子中,我会寻找更舒适的实现方式,不敢相信某个地方还有其他实现方式吗?


珍妮特

07-24 15:44