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