2012-02-24 7 views
2

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

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" как имя узла?

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

+0

Nevermind, я нашел решение, написав собственный TreeNode, который расширяет DefaultMutableTreeNode, а затем перезаписывает функцию toString(). – baizen

ответ

2

Если этот объект посвящен 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 для получения дополнительной информации о деревьях.

+1

или переопределить 'JTree # convertValueToText (...)': http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html> Иногда переопределить toString невозможно; в таком сценарии вы можете переопределить convertValueToText JTree, чтобы отобразить объект из модели в строку, которая отображается. – aterai

+1

Да, действительно. Спасибо, что указал на этот метод, которого я не знал. Я отредактирую свой ответ. –

+0

благодаря всем урским ответам. Это помогает много :) – baizen