2

我正在使用 JTree 创建树视图并将节点添加到其根,如下所示:

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

对于UserObject每个节点,现在的类型为String. 显示"node1"树时显示为节点名称。

但是,我想作为具有 2 个属性UserObject的类的对象添加到节点:nodeObject

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"为节点名称?

任何回复都非常感谢。谢谢!

4

1 回答 1

5

如果此对象专用于 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

于 2012-02-24T10:28:21.173 回答