JTree устанавливает имя узла в качестве одного из атрибутов UserObject

Я использую 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 ответ

Если этот объект выделен для 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);
}

РЕДАКТИРОВАТЬ:

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

Другие вопросы по тегам