2011-04-07 2 views
3

dom4j 문서에서 DocumentTreeModel을 생성하기 위해 dom4j를 사용하고 있습니다.마지막으로 수정 된 지역에서 Jtree를 확장 하시겠습니까?

이 DocumentTreeModel을 JScrollPane 안에 표시합니다.

은 내가 DOM4J 문서에 새 노드를 추가하는 버튼이 있고, 내가로 getPathForRow을 사용하고있는 DocumentTreeModel

을 재현하지만이 매우 제한 보인다. 여러 트리 깊이로 작업 할 수 있어야합니다. 기본적으로 기본적으로 나는 Jtree는 문서마다 문서 편집 다시 그리려고하고 tree.getPathOfLastModifiedChildrensParent()

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

처럼 뭔가를 찾고.

+0

이 질문 작년부터입니다 볼 수 있지만 당신은'TreeModel'을 구현 고려 했는가? 이렇게하면 dom4j 문서의 요소 변경 사항을 추적 할 수 있습니다. –

+1

@JamesPoulson, oh yes ...이 질문을 한 직후 TreeModel을 사용했습니다. – KJW

+0

다행입니다. 그것은 내 편이 좋다. 내가 가진 유일한 문제는 treeStructureChanged 이벤트를 리스너에게 보낼 때 트리가 무너지는 것입니다. 유용성을 위해 나무는 열려 있어야합니다. –

답변

3

문서를 편집 할 때마다 새 모델을 설정하는 것처럼 보이지만 여전히 알림이 실행되지 않는 것 같습니다. 맞습니까? 그렇다면 JTree에 특별한 메소드가 필요하지 않습니다. TreeModel을 올바르게 구현하면됩니다 .-)

재미있게도 DocumentTreeModel을 살펴 보았습니다. 그 위에 매우 작은 커버가 있습니다. DocumentTreeModel의 변경에 Document의 변경을 붙일 수있는 것은 지원되어 있지 않은 DefaultTreeModel입니다. 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 ...) 

흠 ... 내가 더 편안한 구현을 보일 것이다 신발에, 주위 어딘가에 또 다른 구현이 잘못되고 있음을 믿을 수 없다?

CU 지넷

+0

예. 그것이 존재하는 지 모르겠다. .... dom4j.swing은 정말 좋지만, 모든 배관 코드를 구현하는 것처럼 보입니다. – KJW

+0

기본 문제는 문서가 알림을 지원하지 않기 때문에 모델 자체가 문서의 변경 내용을 추적 할 수있는 방법이 없다는 것입니다. 한 가지 방법은 이러한 배관을 DocumentTreeModel에 추가하고 배관 코드를 통해서만 문서를 변경하는 것입니다. 그래도별로 강하지는 않습니다. 다른 하나는 EventTarget을 지원하는 DOM 구현을 찾는 것일 수 있습니다. 그러면 treeModel은 변경 사항을 청취 할 수 있습니다 (Piet Blok의 DOMTreeModel이 있습니다.) 행복하지 않은 동전 :-) – kleopatra

+0

http://www.pbjar.org/docs/ src/org/pbjar/dom/DOMTreeModel.java 올바른 것입니까? 이게 내가 찾고있는 것 같지만이 문제가 있다고 해? – KJW

1

Try-tree.revalidate(); 구성 요소 트리를 새로 고쳐야합니다.

+1

아무런 차이가 없습니다. – KJW