2

JTree を使用してツリー ビューを作成し、次のようにそのルートにノードを追加しています。

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

UserObjectfor each ノードのタイプが になりまし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が述べたように、3番目の解決策は、JTreeをサブクラス化convertValueToText()し、デフォルトのレンダラーが呼び出すメソッドをオーバーライドすることです。ツリーの詳細については、http://docs.oracle.com/javase/tutorial/uiswing/components/tree.htmlを参照してください。

于 2012-02-24T10:28:21.173 に答える