使用文本文件中的数据创建JTree

时间:2013-02-06 07:49:08

标签: java swing text-files jtree defaulttreemodel

如何使用JTree文件中的数据创建.txt?文本文件的格式如下:

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多行。

4 个答案:

答案 0 :(得分:3)

如果txt将具有格式良好的表格(或空格),您可以逐行读取文件,计算空格数,然后根据需要将节点添加到树中。

您可以在java教程How to Use Trees中阅读有关JTree的更多信息。

但正如@Abhishekkumar所说,你有什么尝试?为什么你不能这样做?完成答案,不要让别人做你的工作。

答案 1 :(得分:1)

正如PhoenixS在上面的回答中提到的那样,该程序包括以下步骤:

  1. 逐行阅读.txt文件。在此示例中,我们将BufferedReaderInputStreamReader OR FileReader结合使用,具体取决于我们是将.txt文件作为资源还是分别从文件系统中读取。
  2. 根据.txt文件的格式,使用分隔符确定每行读取时的层次结构级别。使用此选项可以创建Jtree的相关节点。在这种情况下,.txt文件以制表符分隔,并带有指示层次结构级别的选项卡数。
  3. 这是我写的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);
    
        }
    }
    

    以下屏幕截图说明了输出。您可以使用this file作为示例文本文件。

    output of <code>TreeFromTextFileDemo.java</code>

答案 2 :(得分:0)

如果您希望它更灵活,请不要对级别进行硬编码。只需使用Map保留任何给定级别的最后一个节点。当您遍历文件中的项目时,您将可以通过地图访问任何父节点。这是代码......

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

答案 3 :(得分:0)

我遇到了类似的问题并为此编写了一个通用的构建器类。它需要我们的源数据集合和层次结构描述和宾果游戏。的TreeModel。

您还可以实时交换结构。

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

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

希望这有帮助