расширить Jtree в последней измененной области? - PullRequest
3 голосов
/ 07 апреля 2011

Я использую dom4j для создания DocumentTreeModel из документа dom4j.

Я отображаю эту DocumentTreeModel внутри JScrollPane.

У меня есть кнопка, которая добавляет новый узел в документ dom4jи воссоздает DocumentTreeModel

Я использую getPathForRow, но это кажется довольно ограниченным.Мне нужно иметь возможность работать с несколькими глубинами дерева.В основном ищу что-то вроде tree.getPathOfLastModifiedChildrensParent()

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

В основном я пытаюсь заставить Jtree перерисовывать документ каждый раз, когда документ редактируется.

Ответы [ 2 ]

3 голосов
/ 08 апреля 2011

Видя, как вы устанавливаете новую модель при редактировании документа, похоже, что у вас все еще не работает уведомление, верно? Если это так, вам не нужен какой-либо специальный метод в 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 ...)

Хм ... на вашем месте я бы искал более удобную реализацию, не могу поверить, что где-то есть другая реализация?

CU Жанетт

1 голос
/ 07 апреля 2011

Try - tree.revalidate (); Следует обновить дерево компонентов.

...