2011-02-07 24 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

我認爲你不應該在單個函數中建立字符串,但我不知道你的目標是什麼。

爲了保持我的答案是接近你的建議的功能儘可能,你可以嘗試這樣的事:

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有三個參數

  • model:我們要求的模型噸樹節點
  • object:我們要求(包括所有兒童)字符串表示的對象
  • indent:縮進級別
+0

該方法獲取節點的用戶對象。如果JTree使用的是非默認的TreeCellRenderer,那麼如何獲取節點的呈現文本? – buzz3791 2014-09-19 20:08:36

+0

@ buzz3791查看我的新口袋http://stackoverflow.com/a/40648763/1184842 – jan 2016-11-17 07:15:34

2

DefaultMutableTreeNode具有遍歷方法,其在訪問AA樹的所有節點,這取決於幫助具體要求。在您的情況下,預訂Enumeration看起來是適當的,一些片段:

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()); 
    } 
0

我伸出Howards Answer和使用方法的JTree到convertValueToText調用真正的單元格渲染器,並在集合中保存結果,而作爲一個字符串。

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:樹與樹節點
  • model:模型,我們對樹節點要求
  • object:我們要求的字符串表示(包括所有兒童)
  • result對象:收集保存每個節點的字符串值

的方法convertValueToText需要甚至在基本實現使用的參數。但根據樹中使用的對象類型,呈現器可能會使用這些值,並且參數可能需要進行微調。在我的情況下,他們根本不理會。

相關問題