正如PhoenixS在上面的回答中提到的那样,该过程涉及以下步骤:
.txt
逐行读取文件。在此示例中,我们将BufferedReader与InputStreamReader或FileReader结合使用,具体取决于我们是分别将.txt
文件作为资源读取还是从文件系统读取。
- 根据文件的格式
.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);
}
}
以下屏幕截图说明了输出。您可以将此文件用作示例文本文件。