Java进阶之树详解

树组件类JTree----树节点接口TreeNode-----通用节点类DefaultMutableTreeNode

1.创建树节点

DefaultMutableTreeNode()
DefaultMutableTreeNode(Object userObject)
DefaultMutableTreeNode(Object userObject,boolean allowsChildren)------(节点使用数据,是否允许有子节点)

DefaultMutableTreeNode root;
root.add(node);
JTree tree = new JTree(root)

2.处理选中节点事件

2.1树组件的选择模式

TreeSelectionModel model = tree.getSelectionModel();
model.setSelectionMode(int mode);

常量值–TreeSelectionModel静态常量–说明
1----SINGLE_TREE_SELECTION----------只允许选中一个
2----CONTIGUOUS_TREE_SELECTION------允许连续选中多个
4----DISCONTIGUOUS_TREE_SELECTION—允许任意选中多个(默认模式)

2.2数组件触发选择事件

TreeSelectionListener
valueChanged(TreeSelectionEvent e)—当节点被选中时
TreeSelectionEvent —getSource()–JTree对象–(节点路径)TreePath paths[] = getSelectionPaths()

2.2.1TreePath节点路径常用方法—了解

—导入的包import javax.swing.tree.TreePath;

方法说明
getPathComponent(int element)货的路径中指定索引位置的节点对象
getLastPathComponent()获取路径中最后一个节点的对象
getPathCount()获取路径中包含节点的数量
getParentPath()获取路径中除了最后一个节点的路径
pathByAddingChild(Object child)--获取向路径中添加指定节点后的路径
getPathComponent(int element)货的路径中指定索引位置的节点对象
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

public class Tree {
	public static void main(String[] args) {
		JFrame f = new JFrame();
		
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
		DefaultMutableTreeNode subnode1 = new DefaultMutableTreeNode("子节点1");
		DefaultMutableTreeNode subnode2 = new DefaultMutableTreeNode("子节点2");
		
		DefaultMutableTreeNode subnode11 = new DefaultMutableTreeNode("二级子节点1");
		DefaultMutableTreeNode subnode12 = new DefaultMutableTreeNode("二级子节点2");
				
		root.add(subnode1);
		root.add(subnode2);
		subnode1.add(subnode11);
		subnode1.add(subnode12);
		
//		JTree tree = new JTree();
		JTree tree = new JTree(root);//此处的新建的树,如果没有参数的话,起就会按照默认模板,故需要把自己做得树当成参数加入进去
		
		f.getContentPane().add(tree);
		
//		常量值--TreeSelectionModel静态常量--说明
//		1----SINGLE_TREE_SELECTION----------只允许选中一个
//		2----CONTIGUOUS_TREE_SELECTION------允许连续选中多个
//		4----DISCONTIGUOUS_TREE_SELECTION---允许任意选中多个(默认模式)
		
		TreeSelectionModel model = tree.getSelectionModel();
		model.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);//单选
		
		tree.addTreeSelectionListener(new TreeSelectionListener() {//创建一个接口对象
			
			@Override
			public void valueChanged(TreeSelectionEvent e) {
				JTree t = (JTree)e.getSource();//e.getSource()返回的是一个object值,故需要强制转换
				if(!t.isSelectionEmpty()) {//如果值没有空选
					TreePath paths[] = t.getSelectionPaths();
					for(TreePath path:paths) {
//						System.out.println(path);//欲获得所有节点的名称,则需要再次遍历一下
						Object obj[] = path.getPath();//返回的是object值,再次遍历
						for(Object o:obj) {
							System.out.print(o+" ");
						}
						System.out.println();//一个循环结束之后,换一下行
						
					}
				}
			}
		});
		
//		valueChanged(TreeSelectionEvent e)---当节点被选中时
		
		f.setSize(400, 300);
		f.setLocationRelativeTo(null);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setVisible(true);
	}
}

3.遍历树节点

3.1四种遍历方式

  • 按前序遍历
  • 按后序遍历
  • 以长度优先遍历
  • 以深度优先遍历

4.定制树

4.1定制根节点

设置根结点是否可见----setRootVisible(boolean)

4.2定制图标效果

引用的类DefaultTreeCellRenderer—默认树单元渲染类
可通过tree.getCellRenderer()方法来获取该渲染类对象

  • setLeafIcon(new icon)-------子节点图标
  • setOpenIcon(new icon)-----打开图标
  • setClosedIcon(new icon)-----关闭图标
DefaultTreeCellRenderer render =(DefaultTreeCellRenderer)tree.getCellRenderer();//getCellRenderer()返回的是JTree对象,故需要进行强制转
		render.setLeafIcon(new ImageIcon("src/1.png"));//子节点图标
		render.setOpenIcon(new ImageIcon("src/2.png"));//打开图标
		render.setClosedIcon(new ImageIcon("src/3.png"));//关闭图标

4.3定制连接线效果

putClientProperty(Object key, Object value);

连接线效果共有以下三种:

tree.putClientProperty("JTree.lineStyle", "Angled");//默认效果
tree.putClientProperty("JTree.lineStyle", "Horizontal");//连接线水平
tree.putClientProperty("JTree.lineStyle", "None");//无连接线

5.维护树模型

insertNodeInto(MutableTreeNode newChild, MutableTreeNode parent, int index)---添加--(新节点对象,父节点对象,新节点的索引位置)
nodeChanged(TreeNode node)---修改---(修改后的节点对象)
removeNodeFromParent(MutableTreeNode node)---删除---(被删除的节点对象)

6.处理展开节点事件

方法说明
TreeWillExpandListener树节点将要被展开/折叠监听器
treeWillExpand(TreeExpansionEvent event)当节点将要被展开时
treeWillCollapse(TreeExpansionEvent event)当节点将要被折叠时
TreeExpandListener树节点已经被展开/折叠监听器
treeExpand(TreeExpansionEvent event)--当节点已经被展开时
treeCollapse(TreeExpansionEvent event)当节点已经被折叠时

java项目实例如下:

tree.addTreeWillExpandListener(new TreeWillExpandListener() {
			
			@Override
			public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
				TreePath path = event.getPath();
				DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
				System.out.println("节点["+node+"]将要被展开");
			}
			
			@Override
			public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
				TreePath path = event.getPath();
				DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
				System.out.println("节点["+node+"]将要被折叠");
			}
		});
		
		tree.addTreeExpansionListener(new TreeExpansionListener() {
			
			@Override
			public void treeExpanded(TreeExpansionEvent event) {
				TreePath path = event.getPath();
				DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
				System.out.println("节点["+node+"]已经被展开");
			}
			
			@Override
			public void treeCollapsed(TreeExpansionEvent event) {
				TreePath path = event.getPath();
				DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
				System.out.println("节点["+node+"]已经被折叠");
			}
		});
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥创江湖

你的鼓励将是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值