2011-02-07 8 views
4

私は形式にJTreeののテキストを取得したい:JTree:すべてのアイテムのテキストを取得するには?

root 
    sudir1 
    node1 
    node2 
    subdir2 
    node3 
    node4 

それは可能ですか?

私はいくつかのコード

public static String getLastSelectedText(JTree tree) { 
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); 
    if (node == null) return null; 
    return node.getUserObject().toString(); 
} 

を書きました。しかし、それは唯一のコンポーネントのテキストを選択します。

私はツリーを拡張し、すべてのノードを処理すると思いますが、多分それは悪い考えです。

答えて

7

文字列を1つの関数内に構築すべきではないと思いますが、あなたの質問にどのような目的があるのか​​正確にはわかりません。

あなたはこのような何かを試すことが可能な限りあなた示唆された機能の近くに私の答えを保つために:

TreeModel model = tree.getModel(); 
System.out.println(getTreeText(model, model.getRoot(), "")); 

再帰関数とgetTreeText

private static String getTreeText(TreeModel model, Object object, String indent) { 
    String myRow = indent + object + "\n"; 
    for (int i = 0; i < model.getChildCount(object); i++) { 
     myRow += getTreeText(model, model.getChild(object, i), indent + " "); 
    } 
    return myRow; 
} 

getTreeText 3つの引数

を取ります
  • model:私たちが要求するモデル
  • objectツリーノードのためのT:私たちは(すべての子供を含む)のための文字列表現を尋ねるオブジェクト
  • indent:インデントレベル
+0

このアプローチは、ノードのユーザオブジェクトを取得します。 JTreeがデフォルト以外のTreeCellRendererを使用している場合、ノードのレンダリングされたテキストをどのように取得しますか? – buzz3791

+0

@ buzz3791私の新しいanwerを見てくださいhttp://stackoverflow.com/a/40648763/1184842 – jan

2

DefaultMutableTreeNodeのは、AA木のすべてのノードを訪問依存に役立つトラバーサルメソッドを持っています具体的な要件についてあなたの文脈では、preorderEnumerationが適切に見えます。

String result = "\n"; 
    Enumeration<?> enumer = root.preorderEnumeration(); 
    while (enumer.hasMoreElements()) { 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode) enumer.nextElement(); 
     String nodeValue = String.valueOf(node.getUserObject()); 
     String indent = ""; 
     while (node.getParent() != null) { 
      indent += " "; 
      node = (DefaultMutableTreeNode) node.getParent(); 
     } 
     result += indent + nodeValue + "\n"; 
    } 
0

このコードは私のために働いています。 UserObjectをカスタムオブジェクトに置き換えます。 Objオブジェクトから、必要な値を取得できます。

TreePath[] nodes = tre.getSelectionPaths(); 
    for (int i = 0; i < nodes.length; i ++) 
    { 
     TreePath treePath = nodes[i]; 

     DefaultMutableTreeNode node =(DefaultMutableTreeNode)treePath.getLastPathComponent(); 
     <UserObject> Obj = (<UserObject>) node.getUserObject(); 

     String text=Obj.textvalue 

    } 
3
DefaultMutableTreeNode root = (DefaultMutableTreeNode)jTree.getModel().getRoot(); 
    Enumeration e = root.preorderEnumeration(); 
    while(e.hasMoreElements()){ 
     System.out.println(e.nextElement()); 
    } 
+1

ようこそ。あなたの答えの説明のビットを提供することを検討してください –

+0

あなたの仕事が、私はそのNAを説明する必要があります。そして、あなたはこれの背後にある論理とその働きを教えてくれるでしょうか? – Krishna

0

私はHowards Answerを拡張し、実際のセルレンダラーを呼び出し、1つの文字列としてではなく、コレクションに結果を保存するJTreeのメソッドconvertValueToTextを使用。ツリーツリーノードと

  • model:再帰関数と

    TreeModel model = tree.getModel(); 
    Collection<String> results = new LinkedList<>(); 
    getTreeText(tree, model, model.getRoot(), result); 
    System.out.println(Arrays.toString(results.toArray())); 
    

    getTreeText

    private static void getTreeText(JTree tree, TreeModel model, Object object, Collection<String> result) { 
        result.add(tree.convertValueToText(object, true, true, true, 0, true)); 
        for (int i = 0; i < model.getChildCount(object); i++) { 
         getTreeText(tree, model, model.getChild(object, i), result); 
        } 
    } 
    

    getTreeTextは四つの引数

    • tree取るモデルたちがツリーノードを要求
    • object:我々は(すべての子供を含む)のための文字列表現を尋ねるオブジェクト
    • result:各ノードの文字列値を保存するコレクション

    convertValueToTextも基本実装で使用されていないパラメータを取るメソッドに。しかし、ツリーで使用されているオブジェクトタイプによっては、レンダーがこれらの値を消費する可能性があり、パラメータに微調整が必​​要になる可能性があります。私の場合、彼らはどこで無視された。