2013-08-28 69 views
1

我面臨的問題是JTree的樹模型。從JTree中的文本文件動態填充樹模型

我已經定義爲根節點:

javax.swing.tree.DefaultMutableTreeNode rootNode = new javax.swing.tree.DefaultMutableTreeNode(projectName); 

當第一次啓動該應用程序,我想的TreeModel要創建和加載。 對於這一點,我使用的文件meta.txt,其具有類似於下面的信息:

1QuotesPrice.Job 
    2QuotesPrice.Df 
    1Quotes.Job 
    2Quotes.Wf 
    3Quotes.Df 
    2Falkeblang.Wf 
    3Falkeblang.Df 

第一列是水平,第二個是該樹的節點。 現在基於這些信息,我想創建樹模型,但在這裏面臨着障礙。

我不確定適用於將上述節點添加到根節點的邏輯。 我嘗試過的每一件事似乎都有缺陷。 這裏的問題是沒有水平是不固定的,所以我不能簡單地使用if-else構造。 我使用下面的代碼:

 String treeMeta=this.projectsDir+"\\"+projectName+"\\"+"meta.txt"; 
     DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(projectName); 
     File f1=new File(treeMeta); 
     inputStream = new Scanner(f1); 
     while(inputStream.hasNext()){ 

     String val=inputStream.next(); 
     System.out.println("[email protected]#$%"+val+"[email protected]#$%"); 
     treeNodePrev=treeNode; 
     prevLevel=level; 
     level=val.substring(0,1); 
     nodeVal=val.substring(1); 
      if(level.equals("1")){ 
       prevNode=projectName; 
       treeNode = new DefaultMutableTreeNode(nodeVal); 
       System.out.println("added to root node"); 
       rootNode.add(treeNode); 
       //System.out.println("added to root node"); 
      }else if(Integer.parseInt(level)>Integer.parseInt(prevLevel)){ 
       prevNode=nodeVal; 
       treeNode = new DefaultMutableTreeNode(nodeVal); 
       treeNodePrev.add(treeNode); 
      }else if(Integer.parseInt(level)==Integer.parseInt(prevLevel)){ 
       prevNode=nodeVal; 
       treeNode = new DefaultMutableTreeNode(nodeVal); 
       prevParentTreeNode=(DefaultMutableTreeNode)treeNodePrev.getParent(); 
       //System.out.println(prevParentTreeNode.getParent().toString()); 
       prevParentTreeNode.add(treeNode); 
      } 
     } 
     jProjectTree.setModel(new javax.swing.tree.DefaultTreeModel(rootNode)); 
     jScrollPane2.setViewportView(jProjectTree); 

這似乎是工作的罰款,但任何人都可以請告訴我,如果這是正確的做法?

+0

顯示您嘗試過的內容(作爲SSCCE)以及它如何無法正常工作 – kleopatra

+0

增加了實現代碼,目前它的工作狀況良好,但我不確定這是否是更聰明的方法。 – vhora

回答

0

這可能會更清潔一些。只是適應功能計算水平...

public static final DefaultMutableTreeNode getTreeNode(File file) throws IOException { 

    DefaultMutableTreeNode rootNode = null; 
    Map<Integer, DefaultMutableTreeNode> levelNodes = new HashMap<Integer, DefaultMutableTreeNode>(); 
    BufferedReader reader = new BufferedReader(new FileReader(file)); 
    String line; 

    while((line = reader.readLine()) != null) { 

     int level = getLevel(line); 
     String nodeName = getNodeName(line, level); 
     DefaultMutableTreeNode node = new DefaultMutableTreeNode(nodeName);    
     levelNodes.put(level, node); 
     DefaultMutableTreeNode parent = levelNodes.get(level - 1); 

     if(parent != null) { 
      parent.add(node); 
     } 
     else { 
      rootNode = node; 
     } 
    }  
    reader.close(); 
    return rootNode; 
} 

private static final int getLevel(String line) { 

    int level = 0; 
    for (int i = 0; i < line.length(); i++) { 
     char c = line.charAt(i); 
     if(c == '\t') { 
      level++; 
     } 
     else { 
      break; 
     } 
    } 
    return level; 
} 

private static final String getNodeName(String line, int level) { 
    return line.substring(level); 
}  
0

有一個github項目從數據集合創建TreeModels如果有幫助。

下面的示例從書對象列表構建TreeModel。

List<Book> bookList = new ArrayList<>(); 

CollectionTreeModel<Book> treeModel = new CollectionTreeModel 
     .Builder<>(bookList) 
     .addNode(b -> b.publisher) 
     .addNode(b -> b.author) 
     .addNode(b -> b.title) 
     .build(); 

JTree jTree = new JTree(treeModel); 

假設書是在同一個包,看上去就像......

public class Book { 
    final String publisher; 
    final String author; 
    final String title; 

    Book(String publisher, String author, String title) { 
     ... 
    } 
} 

欲瞭解更多信息:

https://github.com/mnrussell/collectionTreeModel

有點晚了,但是希望這有助於:O)