1.效果
1.1 读取格式化信息
01 代表一级节点, 0101 表示01下的二级节点,其他以此类推
1.2 显示
2.操作步骤
2.1 思考
如何能够做到能够做到,在向txt文件中追加信息时,不论节点多深,都能够显示。
2.2 操作
如果想要能够一直往下显示,我的思考需要用递归,先把各个节点当做一棵树,01是一个树,0101是01的子树。
2.3 思考
递归可以解决无线往下增加层级,那么如何做到,判断树与树之间的关系,如果读取文本信息内容数据无序(首先需要强调,文本信息不会出现这种情况,文本中没出现一级节点 01,却有二级节点 0101。同时也要强调,无序指的是,0101 出现在 01之前)。-- Map ,将 所有的数据读入,把读入的数据当做key,map会根据key值自动排序。
2.4 思考
数据读入后,如何加入节点? 定义类 Tree, 每个数据相当于一个Tree,并且Tree中含有子树
2.5 思考
如何确定 0101 是01的子树, 0201 是 02的子树?
- 观察数据可知,数据信息最后两位表示当前节点,之前的数据就是其父节点的信息。
0101 除去后两位可以知道 是01,而01就是其父节点。
3. 编程实现
编写类 Tree,每个数据就是一个Tree,方便确定数据间的关系
public class Tree {
private String id;// 把读入数据当做id
private String name;// 显示在JTree中节点时的名字
private List<Tree> children = new ArrayList<Tree>();// 子树
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Tree> getChildren() {
return children;
}
public void setChildren(List<Tree> children) {
this.children = children;
}
}
编写实现JTree代码,
1. 首先把数据信息读入,存到map中,以 读入信息为 key,相应的Tree(tree的id设置为 读入信息 )为value。
2. 把读入信息存入数组nodes中,用于后面查找父节点使用。
3. 直接确定01 02 03是根节点下的一级节点。
4. 遍历nodes数组,找寻非一级节点的父节点,并且将其与父节点关系确定。
5. 通过上一步使用Tree确定的关系,递归建立每个节点间的关系。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class TreeViewShow {
static Tree parent;
static JTree treeView;
static DefaultMutableTreeNode root = new DefaultMutableTreeNode("顶级节点");// 根节点
static Map<String,Tree>map = new HashMap<String,Tree>();
static String[] nodes = new String[100];
static int len;
public static void main(String[] args) {
// 设置窗口名字
JFrame frame = new JFrame("Demo");
// 设置关闭时间
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 显示窗口
frame.setBounds(300, 200, 500, 300);
treeView = new JTree(root);
frame.add(new JScrollPane(treeView));
//frame.pack();
frame.setVisible(true);
parent = new Tree();
readFile();
}
public static void readFile() {
try {
// 读取文件内容
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(new File("src/resource/menu.txt")), "UTF-8"));
String line = "";
len = 0;
// 一行一行获取文件内容
while ((line = br.readLine()) != null) {
// 每一行都代表着一个节点,看做为一棵树
Tree child = new Tree();
// 把树的ID设置为读取的内容
child.setId(line);
// 放入map中
map.put(line,child);
// 将读取内容存入nodes数组,map 与 nodes 用于后面判定节点与节点之间的关系
nodes[len++] = line;
// 存入数据为01 02 03 之类的 长度为2的,可以确定为一级节点,
// 作为顶级节点的子树
if(nodes[len-1].length()==2) {
//child.setName(); 为节点赋值 名称
root.add
parent.getChildren().add(child);
}
}
for (int i = 0; i < len; i++) {
// 一级节点不考虑,已经确定好关系
if(nodes[i].length()<=2) {
continue;
}
// 截取其从 0-(len-2)为的字符,用于找到其父节点
String upMenu = nodes[i].substring(0, nodes[i].length()-2);
//System.out.println("upmenu:"+upMenu);
// 从Map 中找到其父节点所对应的树
Tree sparent = map.get(upMenu);
// 从Map中找到该字符串所对应的的树
Tree schild = map.get(nodes[i]);
// 这句话可有可无 -- 之前
schild.setId(nodes[i]);
//System.out.println("sparent:"+sparent.getId()+"-schild:"+schild.getId());
// 确定二者之间的关系
sparent.getChildren().add(schild);
}
// 通过以上程序可以确定所有节点之间的关系,之后需要将关系转换为JTree 中 Node与Node之间的关系
addNodes(parent,root); // 递归实现
} catch (Exception e) {
e.printStackTrace();
}
}
private static void addNodes(Tree tree, DefaultMutableTreeNode root) {
// 获取该树 所有的孩子 -子树
List<Tree> children = tree.getChildren();
// 遍历子树,将子树转化为节点,加入到当前树的节点中作为子节点。
for (int i = 0; i < children.size(); i++) {
DefaultMutableTreeNode child = new DefaultMutableTreeNode(children.get(i).getId());
root.add(child);
// 判断子树是否还有子树,有的话,继续递归
if(children.get(i).getChildren()!=null) {
addNodes(children.get(i),child);
}else {
return ;
}
}
}
}