2012-01-17 2 views
2

У меня есть JTree (myTree) и в другом классе, у меня есть DefaultMutableTreeNode, который был взят из myTree.выделить TreeNode в JTree с использованием самого TreeNode

В определенной функции я хочу, чтобы JTree выделил узел.

Я пробовал:

myTree.setSelectionPath(new TreePath(treeNode)); 

но визуально ничего не происходит.

любые идеи?

ОБНОВЛЕНИЕ:

У меня есть еще один JTable, который оказывает на основании выбранного treeNode в myTree. Таблица обновляется правильно. Это всего лишь myTree, который отказался обновлять визуально.

+0

Является ли дерево сфокусированным во время вызова функции? Мне не нужно было спрашивать, разместили ли вы [SSCCE] (http://sscce.org/). –

+0

@AndrewThompson Нет, на самом деле фокус находится в другом JTree. Извините, я не могу опубликовать больше кода, потому что он очень конфиденциальный. Я не знаю, разрешено ли мне задать вопрос здесь: P –

+0

@AndrewThompson см. Мое обновление. –

ответ

4

Вам необходимо использовать фактический путь к дереву узла. Не просто экземпляр TreePath:

myTree.setSelectionPath(new TreePath(treeModel.getPathToRoot(treeNode))); 

Кроме того, Javadoc говорит:

Если какой-либо компонент пути скрыт (под рухнувшей узла), и getExpandsSelectedPaths правда она подвергается воздействию (сделано видимый)

Так что удостоверьтесь, что getExpandsSelectedPaths является правдой.

+0

Нет, это не сработало.Я думаю, что это связано с тем, что дерево не сфокусировано, как @AndrewThompson предложил –

+0

Plz, см. Мое обновление –

+0

См. Мой обновленный ответ. –

4

Из Java API, мы получаем описание TreePath ниже:

Представляет собой путь к узлу. TreePath - это массив объектов, которые выходят из TreeModel. Элементы массива упорядочены так, что корень всегда является первым элементом (индекс 0) массива.

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

+0

Спасибо. Это была проблема с неправильным treePath –

+0

Извините, но я не заметил, что @JBNizet ответил первым. Вы получите выигрыш –

0

Многие свинг ошибки, причуды и другие недостатки можно обойти с помощью SwingUtilities.invokeLater(Runnable):

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     // JB Nizet's solution: 
     myTree.setSelectionPath(new TreePath(treeModel.getPathToRoot(treeNode))); 
    } 
}); 

Это также решает ту же проблему с JTree.setSelectionPaths(TreePath[]).

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