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 を調べました。これは、Document の変更を DocumentTreeModel の変更に接着するためのサポートが何もない、DefaultTreeModel の上にある非常に小さなカバーです。Leaf-/BranchTreeNode が TreeNode のみを実装するという事実 (さらに一歩進んで MutableTreeNode を実装するのではなく) は、モデルのヘルパー メソッドによるノードの挿入/削除を無効にします。短編小説: すべての大変な作業はあなたに任されています。

基本的に、基になるドキュメントの変更をツリーモデルに認識させる必要があります。(疑似コード) のようなもの:

 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ジャネット

于 2011-04-08T10:46:24.273 に答える
1

試してください--tree.revalidate(); コンポーネントツリーを更新する必要があります。

于 2011-04-07T17:45:23.087 に答える