2010-06-02 3 views
3

У меня есть мастер с несколькими экранами, где пользователь должен заполнить свои данные для дальнейшей обработки. На втором экране у меня есть радиогруппа с тремя переключателями, которые позволяют добавлять дополнительные элементы. Чтобы продолжить, пользователь должен выбрать один из них. Когда пользователь выбирает третью кнопку, выбирается только один выбор JTree, заполненный данными, и пользователь должен выбрать из него вариант. Затем пользователь должен нажать «Далее», чтобы перейти к следующему экрану. Опция, которую он выбрал, хранится как TreePath. Все идет нормально.Как получить JTree расширен?

Моя проблема заключается в следующем. Если пользователь хочет вернуться со следующего экрана на экран с помощью JTree, я хочу предоставить его с JTree, расширенным до выбранного варианта и выделения опции. Тем не менее, что бы я ни пытался сделать для этого (любые комбинации expandPath, scrollPathToVisible, addSelectionPath, makeVisible) всегда предоставляет мне свернутое дерево. Я пытаюсь расширить как листья, так и узлы. Мой код выглядит следующим образом:

rbProcessJTree.setSelected(isProcessJTree()); 

if (null != getSelectedTablePath()){ 
    trTables.addSelectionPath(getSelectedTablePath()); 
    trTables.expandPath(getSelectedTablePath()); 
    trTables.scrollPathToVisible(getSelectedTablePath()); 
} 

Когда setSelected() называется, изменение состояния слушателя вызывается, что позволяет JTree. Модель загружается во время инициализации формы.

Каждый раз, когда я переключаюсь между экранами, я сохраняю входные данные с предыдущего экрана и удаляю его. Затем, когда мне нужно открыть предыдущий экран, я сохраняю данные со следующего экрана, удаляю его, загружаю данные на этот экран и показываю. Поэтому каждый раз, когда экран генерируется с нуля.

Не могли бы вы объяснить, какая последовательность операций должна быть выполнена, чтобы получить JTree, развернутый во вновь созданной форме, с загруженной моделью данных и выбором пути?

+0

Здравствуйте Dzmitry Железниченко, Вы были в состоянии получить ответ на свой вопрос? Я столкнулся с той же проблемой, я разместил ее здесь

http://stackoverflow.com/questions/6252462/jtree-lazy-load-expand
Просьба сообщить. – ShamsR

ответ

1

Вот код, который я использовал для записи расширений и выбранных путей в JTree. Вы можете записывать состояние здесь между страницами «Следующий» и «Назад».

// record expanded nodes to reinstate later; 
TreePath rootPath= new TreePath(objectWeKnowIsAtRoot); 

Enumeration<TreePath> expandedPaths = tree.getExpandedDescendants(rootPath); 

// record current-selection - it's OK if it's null 
TreePath selectedPath = tree.getSelectionPath(); 


// ******* do stuff that may, and often will, modify our tree content ******** 


// restore valid expansion paths (some may - correctly - have been removed in modifications) 
while (expandedPaths != null && expandedPaths.hasMoreElements()) 
{ 
    TreePath path = expandedPaths.nextElement(); 
    if (isPathValid(path)) 
    { 
     tree.expandPath(path); 
    } 
} 

// restore selected path, if apt 
if (isPathValid(selectedPath)) 
{ 
    tree.setSelectionPath(selectedPath); 
} 

Метод isValidPath(), используемый выше, основана на этом:

http://forums.sun.com/thread.jspa?threadID=567157&tstart=38085

+0

Я пробовал этот подход, но он тоже не работает. Не знаю причины. Позже увидели, что пути, возвращенные в перечислении, имеют случайный порядок, преобразовали их в ArrayList и отсортировали, начиная с корня, чем пытались с этим. Без шансов. Добавлен expandPath() для выбранного пути. Ни за что. Нет идей. Спасибо за ответ, хотя. Кстати, когда я его отлаживаю, я вижу, что для моего пути выбора isVisible() является true, но isExpanded() является ложным. Может ли это помочь? –

+0

Хм; вы определенно делаете материал для выбора/расширения после заполнения данных?Что вы могли бы попробовать, это добавить кнопку «отлаживать эту» в свой мастер, который при нажатии делает выбор/расширение, давая вам возможность визуально подтвердить, что да все данные присутствуют и правильны в первую очередь? – Brian

+0

Я попробую через час или около того, когда закончите с текущей задачей. Однако isPathValid() всегда возвращает true во время отладки, и метод expandPath() выполняется соответственно в вашем алгоритме. Это должно означать, что данные еще были заселены, не так ли? Я заполняю модель данных при инициализации формы. Только после этого я пытаюсь выполнить с ним некоторые действия. Возможно, что-то должно быть изучено относительно моего слушателя изменений состояния для переключателя. Он срабатывает несколько раз, прежде чем я получу метод обработки дерева. –

1

Если вы используете DefaultMutableTreeNode, вы всегда можете использовать Enumeration для поиска TreeNode вы хотите. Тогда setSelectionPath() должен работать, если верно getExpandsSelectedPaths().

Edit: я больше думаю, как с помощью Enumeration из DefaultMutableTreeNode:

JTree tree = new JTree(); 
DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot(); 
... 
private TreePath find(DefaultMutableTreeNode root, String s) { 
    Enumeration<DefaultMutableTreeNode> e = root.depthFirstEnumeration(); 
    while (e.hasMoreElements()) { 
     // return match 
    } 
    return null; 
} 

Тогда вы можете сделать это:

TreePath path = find(root, "pizza"); 
tree.setSelectionPath(path); 
tree.scrollPathToVisible(path); 
+0

Список tpa = treeStorage.getExpandedPathsList(); if (null! = Tpa) { Collections.sort (tpa, new TreePathComparator()); для (TreePath t: tpa) { if (isPathValid (t)) { trTables.expandPath (t); }} } , если (isPathValid (treeStorage.getSelectedTablePath())) { trTables.setSelectionPath (treeStorage.getSelectedTablePath()); System.out.println ("expand:" + trTables.getExpandsSelectedPaths()); } Этот код возвращает меня true. Однако дерево все еще рухнуло. Перечисление возвращает результаты в случайном порядке и не может быть сброшено, поэтому я изменил его на ArrayList. Извините за форматирование. –

Смежные вопросы