Как расширить JTree? - PullRequest
3 голосов
/ 02 июня 2010

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

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

rbProcessJTree.setSelected(isProcessJTree());

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

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

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

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

Ответы [ 2 ]

1 голос
/ 02 июня 2010

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

Редактировать: я больше думал об использовании 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);
1 голос
/ 02 июня 2010

Вот код, который я использовал для записи расширения и выбранных путей в JTree. Здесь вы можете записать данные о состоянии между страницами Next и Back.

// 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

...