资讯详情

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+"]已经被折叠");
			}
		});

标签: angled连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台