簡體   English   中英

從JTree中的文本文件動態填充樹模型

[英]Dynamically populating the tree model from a text file in 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("!@#$%"+val+"!@#$%");
         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);

這似乎工作正常,但是有人可以告訴我這是否正確嗎?

這可能會更清潔一些。 只需調整用於計算水平的功能...

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

有一個github項目,如果有幫助的話,可以從數據集合中創建TreeModels。

下面的示例是從Book對象列表中構建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);

假設Book在同一個包裝中,看起來像...

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM