bai*_*zen 2 java swing jtree nodename user-object
我正在使用 JTree 创建树视图并将节点添加到其根,如下所示:
String nodeName = "node1";
DefaultMutableTreeNode child = new DefaultMutableTreeNode(nodeName);
root.add(child);
Run Code Online (Sandbox Code Playgroud)
现在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
}
Run Code Online (Sandbox Code Playgroud)
当我将此 nodeObject 添加到树节点时:
nodeObject nodeObject = new nodeObject("node1",true);
DefaultMutableTreeNode child = new DefaultMutableTreeNode(nodeObject);
root.add(child);
Run Code Online (Sandbox Code Playgroud)
它显示object ID为节点名称。我的问题是,如何设置节点名称nodeObject.getName()以便树可以显示"node1"为节点名称?
任何答复都非常感谢。谢谢!
如果此对象专用于 JTree,且未在其他任何地方使用,则最简单的方法是覆盖该toString()方法并从此方法返回名称:
@Override
public String toString() {
return this.nodeName;
}
Run Code Online (Sandbox Code Playgroud)
如果你想要一个不同的 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);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
正如 aterai 在评论中提到的,第三个解决方案是继承 JTree 并覆盖convertValueToText()默认渲染器调用的方法。有关树的更多详细信息,请参阅http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html。