在最后修改区域扩展Jtree?

时间:2011-04-07 10:24:27

标签: java swing jtree dom4j treemodel

我正在使用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重绘文档。

2 个答案:

答案 0 :(得分:3)

看到您在编辑文档时设置新模型看起来仍然没有运行通知,对吧?如果是这样,您在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 ...)

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

CU 珍

答案 1 :(得分:1)

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