манипулировать узлом jtree с помощью ссылок, кажется, не работает (свинг) - PullRequest
1 голос
/ 22 декабря 2010

У меня следующая проблема (это связано с моим постом мигать узлом дерева ):
У меня есть пользовательское средство визуализации ячеек.
В некоторой части моего кода я создаю новый DefaultMutableTreeNode и сохраняю его в списке

public static List<DefaultMutableTreeNode> nodes = new ArrayList<DefaultMutableTreeNode>() 
//in some time
DefaultMutableTreeNode aNode = new DefaultMutableTreeNode("SomeValue");
nodes.add(node);

В моем рендерере я делаю:

public Component getTreeCellRendererComponent(JTree tree, Object value,
      boolean selected, boolean expanded, boolean leaf, int row,
      boolean hasFocus) {
    DefaultMutableTreeNode n = (DefaultMutableTreeNode)value;
    if(nodes.contains(n)){
     //set background to red
    }
}

В этот момент узлы имеют узел, но код никогда не переходит в ветвь if.
Зачем? Я не могу понять, так как я уже сохранил его в arraylist. Получу ли я другую ссылку?
Также я создал таймер свинга:

Timer t = new Timer(400, new ActionListener(){
   public void actionPerformed(ActionEvent evt) {
        if(nodes.size == 0)
            return;
        TreePath p = new TreePath(nodes.get(0));
        Rectangle r = tree.getPathBounds(p);
        tree.repaint(r);
   }

});    

Но я получаю NPE в tree.getPathBounds.
Я не могу понять, почему. Не могу ли я манипулировать DefaultMutableNodes, которые я хранил в своем списке таким образом? Что я делаю не так в своих мыслях?
Примечание: если я просто позвоню repaint (); в таймере и в модуле рендеринга я перебираю узлы, чтобы увидеть, отображает ли он тот же текст с сохраненным мной узлом, что я хочу получить, мигает, работает

Спасибо

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Я не думаю, что DefaultMutableTreeNode определяет метод equals, поэтому он может не найти соответствия в вашем списке узлов.Попробуйте сохранить и найти пользовательский объект или расширить DefaultMutableTreeNode и определить равно.

0 голосов
/ 23 декабря 2010

На самом деле TreePath - это список объектов ... путь от корня дерева до узла. Если вы создаете путь из одного узла, путь существует в дереве, только если этот узел является корнем дерева. Я рекомендую использовать метод TreeSelectionEvent public TreePath[] getPaths(). Метод обеспечивает фактические пути.

...