JTree устанавливает имя узла как один из атрибутов UserObject - PullRequest
2 голосов
/ 24 февраля 2012

Я использую JTree для создания древовидного представления и добавления узла к его корню следующим образом:

String nodeName = "node1";
DefaultMutableTreeNode child = new DefaultMutableTreeNode(nodeName);
root.add(child);

UserObject для каждого узла теперь имеет тип String.Он отображает "node1" как имя узла при отображении дерева.

Однако я хочу добавить UserObject к узлу как объект класса nodeObject с 2 атрибутами:

private class nodeObject{
    private String nodeName;
    private boolean isSomethingElse;
    public nodeObject(String name, boolean something){
       nodeName = name;
       isSomethingElse = something;
    }
    public String getName(){
       return nodeName;
    }
    //Other setter/getter after these code
}

Когда я добавляю этот nodeObject к узлу дерева:

nodeObject nodeObject = new nodeObject("node1",true);
DefaultMutableTreeNode child = new DefaultMutableTreeNode(nodeObject);
root.add(child);

Показывает object ID в качестве имени узла.У меня вопрос, как я могу установить имя узла как nodeObject.getName(), чтобы дерево могло показывать "node1" как имя узла?

Любой ответ очень ценится.Спасибо!

1 Ответ

3 голосов
/ 24 февраля 2012

Если этот объект выделен для JTree и не используется где-либо еще, самый простой способ - переопределить метод toString() и вернуть имя из этого метода:

@Override
public String toString() {
    return this.nodeName;
}

Если вам нужен другой метод toString (), который можно было бы использовать для предоставления дополнительной информации, например, при отладке, тогда установите пользовательский TreeCellRenderer для дерева. Этот пользователь может просто расширить DefaultTreeCellRenderer и переопределить следующий метод:

@Override
public Component getTreeCellRendererComponent(JTree tree,
                                              Object value,
                                              boolean sel,
                                              boolean expanded,
                                              boolean leaf,
                                              int row,
                                              boolean hasFocus) {
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
    NodeObject nodeObject = (NodeObject) node.getUserObject();
    return super.getTreeCellRendererComponent(tree,
                                              nodeObject.getName(),
                                              sel,
                                              expanded,
                                              leaf,
                                              row,
                                              hasFocus);
}

EDIT:

Третье решение, упомянутое aterai в комментариях, заключается в создании подкласса JTree и переопределении метода convertValueToText(), который вызывает средство визуализации по умолчанию. См. http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html для более подробной информации о деревьях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...