簡體   English   中英

使用文本文件中的數據創建JTree

[英]Create JTree using data from text file

如何使用.txt文件中的數據創建JTree 文本文件的格式如下:

Root Node
        Category A
            Sub-Category A1
                Item A1.0
                Item A1.1
                Item A1.2
            Sub-Category A2
                Item A2.0
                Item A2.1
                Item A2.2       
        Category B
            Sub-Category B1
                Item B1.0
                Item B1.1
            Sub-Category B2
                Item B2.0
                Item B2.1
            Sub-Category B3
                Item B3.0
                Item B3.1
                Sub-Sub-Category B3_1
                    Item B3_1.0
                    Item B3_1.1
        Category C
            ... etc

.txt文件包含700多行。

如果txt的表格式(或空格)格式正確,則可以逐行讀取文件,計算空格數,然后根據需要將節點添加到樹中。

您可以在Java教程“ 如何使用樹”中閱讀有關JTree的更多信息。

但是正如@Abhishekkumar所說,您嘗試了什么? 為什么你做不到呢? 完成答案,不要讓別人去做。

就像PhoenixS在上面的回答中提到的那樣,該過程涉及以下步驟:

  1. 逐行讀取.txt文件。 在此示例中,我們分別將BufferedReaderInputStreamReaderFileReader結合使用,具體取決於我們是將.txt文件作為資源讀取還是從文件系統讀取。
  2. 根據.txt文件的格式,使用定界符確定正在讀取的每一行的層次結構級別。 使用它來創建Jtree的相關節點。 在這種情況下, .txt文件使用制表符分隔,其中制表符數量指示層次結構級別。

這是我編寫的TreeFromTextFile類:

/*
 * File: TreeFromTextFile.java
 * Created 2013-02-06
 * This Class creates a JTree using data from a Specially formatted text File.
 * The supplied text file is tab-delimited, as illustrated at:
 * https://stackoverflow.com/questions/14724014/create-jtree-using-data-from-text-file
 * 
 * You can use either InputStreamReader to read thetext file as a resource
 * or use FileReader to read the text file from the file System
 */


import java.io.BufferedReader;
//import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;

/**
 * @author engineervix
 *
 */
public class TreeFromTextFile {

private BufferedReader in;
private LineNumberReader ln;
private String line;    //value of a line in the text file
private String root;    //value to be used for the root Node of our JTree                         
private String filename = "TheTextFile.txt";
private String encoding = "UTF-8";
private DefaultMutableTreeNode top;
private JTree tree;

public TreeFromTextFile() {
    getRootNode();
    top = new DefaultMutableTreeNode(root);
    createNodes(top);

    //Create a tree that allows one selection at a time.
    tree = new JTree(top);
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
}

//this method reads the file and prints all the lines to standard output
//for testing purposes
public void readFile() {
    try {
        //in = new BufferedReader(new FileReader("Path\\To\\File.txt"));
        in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(filename), encoding));

        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

//this method reads the first line in the text file and assigns it 
//to the root variable which will be used for the root node of our JTree
private void getRootNode() {
    try {
        //in = new BufferedReader(new FileReader("Path\\To\\File.txt"));
        in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(filename), encoding));
        ln = new LineNumberReader(in);

        if (ln.getLineNumber() == 0) {
            root = ln.readLine();
            //System.out.println(root);
        }

        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * this method counts the number of occurrences of a given
 * <code>char</code> in the Specified
 * <code>String</code> source:
 * https://stackoverflow.com/questions/275944/how-do-i-count-the-number-of-occurrences-of-a-char-in-a-string
 */
private int countOccurrences(String haystack, char needle) {
    int count = 0;
    for (int i = 0; i < haystack.length(); i++) {
        if (haystack.charAt(i) == needle) {
            count++;
        }
    }
    return count;
}

//create the Nodes
private void createNodes(DefaultMutableTreeNode top) {
    DefaultMutableTreeNode category = null;     // Level 1 in Hierarchy
    DefaultMutableTreeNode subCategory = null;  // Level 2 in Hierarchy
    DefaultMutableTreeNode leaf = null;         // Level 3 in Hierarchy    

    try {
        //in = new BufferedReader(new FileReader("Path\\To\\File.txt"));
        in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(filename), encoding));

        while ((line = in.readLine()) != null) {
            if (countOccurrences(line, '\t') == 1) {
                category = new DefaultMutableTreeNode(line);
                top.add(category);
            } else if (countOccurrences(line, '\t') == 2) {
                subCategory = new DefaultMutableTreeNode(line);
                category.add(subCategory);
            } else if (countOccurrences(line, '\t') == 3) {
                leaf = new DefaultMutableTreeNode(line);
                subCategory.add(leaf);
            } //continue the else...if - if you have more levels
        }
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

    public JTree getTree() {
        return tree;
    }
}

為了測試以上內容,我編寫了TreeFromTextFileDemo類,如下所示:

/*
 * Requires TreeFromTextFile.java
 */

import java.awt.BorderLayout;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;

/**
 * @author engineervix
 */
public class TreeFromTextFileDemo {

private static TreeFromTextFile tr = new TreeFromTextFile();

public static void main(String[] args) {
    JFrame frame = new JFrame("Demo | Creating JTree From File.txt");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container content = frame.getContentPane();

    JTree t = tr.getTree();

    content.add(new JScrollPane(t), BorderLayout.CENTER);
    frame.setSize(275, 300);
    frame.setLocationByPlatform(true);
    frame.setVisible(true);

    }
}

以下屏幕截圖說明了輸出。 您可以將此文件用作示例文本文件。

<code> TreeFromTextFileDemo.java </ code>的輸出

如果您希望它更靈活,請不要對級別進行硬編碼。 只需使用地圖將最后一個節點保留在任何給定級別即可。 遍歷文件中的項目時,您將可以通過地圖訪問任何父節點。 這是代碼...

public class StructureBuilder {

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

我有一個類似的問題,為此編寫了一個通用的生成器類。 它需要我們的源數據集合以及層次結構描述和賓果游戲。 TreeModel。

您還可以實時交換結構。

https://stackoverflow.com/a/29823595/4824123

項目: https//github.com/mnrussell/collectionTreeModel

希望這可以幫助

暫無
暫無

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

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