Java读取txt文件中格式化信息,显示到JTree中

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值