2013-07-17 2 views
1

У меня есть проблема, которая также была описана here.JTree: Отсутствует ссылка между TreeNode и TreePath

У меня есть метод invertExpand в MyTree класса, который работает следующим образом:

public void invertExpand(DefaultMutableTreeNode node) { 
    TreePath path = new TreePath(node.getPath()); // no better way to get TreePath from TreeNode :(
    if (!isExpanded(path)) { 
     expandPath(path); 
    } else { 
     collapsePath(path); 
    } 
} 

Но проблема isExpanded() метод использует HashMap для хранения расширенных путей. Кажется, что isExpanded() никогда не возвращает true для вновь созданного TreePath. (Но они действительно расширены)

Есть ли способ исправить эту проблему?

+0

хорошо, в следующий раз покажите SSCCE, который демонстрирует проблему (вместо того, чтобы оставить эту задачу ответчику ;-) – kleopatra

ответ

4

Развернуть/свернуть работы на не листовыми узлами, поэтому убедитесь, что данный узел не лист:

public void invertExpand(DefaultMutableTreeNode node) { 
    if (node.isLeaf()) 
     node = (DefaultMutableTreeNode) node.getParent(); 
    TreePath path = new TreePath(node.getPath()); // no better way to get TreePath from TreeNode :(
    if (isExpanded(path)) { 
     collapsePath(path); 
    } else { 
     expandPath(path); 
    } 
} 

Редактировать (как на комментарий ФП в)

Реальная причиной неправильного поведения был неправильно реализованный hasCode в настраиваемом узле, который путал Map (где хранятся расширенные пути).

+0

ну, то ваша реализация узла неверна - листья не могут быть расширены, поэтому получите то, что вы просили (от дерева ;-) BTW: теперь это _really_ время для sscce, без возможности ответить на ваш вопрос ... – kleopatra

+0

hmm @kleopatra напишите в ответ, что 'isExpanded()', 'expandPath()' и 'collapsePath() 'используйте' HashMap', поэтому мне нужно проверить переопределения 'equals()' и 'hashCode()'. – SeniorJD

+0

Хммм, любопытно: _why_ вы переопределили равные, это немного необычно? – kleopatra