Java Swing高级组件——树组件

Swing树组件

树状结构是一种常用的信息表现形式,它可以直观的显示出一组信息的层次结构。Swing 中的 JTree 类用来创建树。

一,创建一个简单的树

JTree有三种常见的构造方法用来创建树。

构造方法 说明
JTree() 创建一个默认的树
JTree(TreeNode root) 根据指定的根节点创建树
JTree(TreeModel newModel) 根据指定树模型创建树

DefaultMutableTreeNode 类实现了 TreeNode 接口,用来创建树的节点。一个树只能有一个父节点,可以有0或多个子节点。利用 DefaultMutableTreeNode 类的 add(MutableTreeNode newChild) 方法可以为该节点添加子节点,拥有子节点的节点称为父节点,没有父节点的节点称为根节点。

DefaultMutableTreeNode 类的常用构造方法

构造方法 说明
DefaultMutableTreeNode() 创建一个默认的节点,默认情况下允许有子节点
DefaultMutableTreeNode(Object userObject) 创建一个具有指定标签的节点
DefaultMutableTreeNode(Object userObject, boolean allowsChildren) 创建一个具有指定标签的节点,并且指定是否允许有子节点

创建一个简单的树,代码如下:

package study.czm;

import java.awt.Container;

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;

public class Study {
    
    

	public static void main(String[] args) {
    
    

		JFrame jf = new JFrame();
		jf.setTitle("表格组件");
		jf.setSize(500, 400);
		jf.setLocationRelativeTo(null);
		jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);
		Container c = jf.getContentPane();

		// 创建根节点
		DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
		// 创建一级子节点
		DefaultMutableTreeNode root1 = new DefaultMutableTreeNode("一级子节点1");
		DefaultMutableTreeNode root2 = new DefaultMutableTreeNode("一级子节点2");
		DefaultMutableTreeNode root3 = new DefaultMutableTreeNode("一级子节点3");
		// 创建二级子节点
		DefaultMutableTreeNode root11 = new DefaultMutableTreeNode("二级子节点1");
		DefaultMutableTreeNode root12 = new DefaultMutableTreeNode("二级子节点2");
		DefaultMutableTreeNode root21 = new DefaultMutableTreeNode("二级子节点3");
		// 根节点添加一级子节点
		root.add(root1);
		root.add(root2);
		root.add(root3);
		// 一级子节点添加二级子节点
		root1.add(root11);
		root1.add(root12);
		root2.add(root21);

		JTree tree = new JTree(root);
		c.add(tree);

		jf.setVisible(true);

	}
}

运行效果:
在这里插入图片描述

二,处理选中节点事件

树的节点允许为被选中和取消选中状态,通过捕获节点的选择事件,可以处理相应的操作,树的选择模式有三种,通过 TreeSelectionModel 类的对象可以设置树的选择模式。

TreeSelectionModel 类中代表选择模式的静态常量

静态常量 说明
SINGLE_TREE_SELECTION 只允许选中一个
CONTIGUOUS_TREE_SELECTION 允许连续选中多个
DISCONTIGUOUS_TREE_SELECTION 允许任意选中多个,为数的默认模式

TreePath 类表示树节点的路径,即通过该类可以获得子节点所属的父节点,以及父节点所属的上级节点,直到数的根节点。

TreePath 类的常用方法

方法 说明
getPath() 以 Object 数组的形式返回该路径所有节点的对象,在数组中的顺序按照从根节点到子节点的顺序
getLastPathComponent() 获得路径中最后一个节点的对象
getParentPath() 获得路径中除了最后一个节点的路径
pathByAddingChild(Object child) 获得向路径中添加指定节点后的路径
getPathCount() 获得路径中包含节点的数量
getPathComponent(int element) 获得路径中指定索引位置的节点对象

三,遍历树节点

遍历树节点有四种方法,按前序遍历,按后序遍历,以广度优先遍历,以深度优先遍历。其中后序遍历和深度优先遍历这两种遍历方式的具体遍历方法相同。

按前序遍历:
在这里插入图片描述
按后序遍历:
在这里插入图片描述
以广度优先遍历:
在这里插入图片描述
以深度优先遍历:
在这里插入图片描述
通过 DefaultMutableTreeNode 类的 children() 方法,可以得到仅包含该节点子节点的枚举对象,以便快速遍历节点的子节点。

DefaultMutableTreeNode 类的常用方法

方法 说明
getLevel() 获得该节点相对于根节点的级别值,如跟节点的子节点的级别值为1
getDepth() 获得以此节点为根节点的数的深度,如果该节点没有子节点,则深度为0
getParent() 获得该节点的父节点对象
getChildCount() 获得该节点拥有子节点的个数
getFirstChild() 获得该节点的第一个子节点对象
getSiblingCount() 获得该节点拥有兄弟节点的个数
getNextSibing() 获得该节点的后一个兄弟节点
getPreviousSibling 获得该节点的前一个兄弟节点
getPath() 获得该节点的路径
isRoot() 判断该节点是否为根节点
isLeaf() 判断该节点是否为叶子节点

四,定制树

在使用树时,经常需要对树进行一系列的设置,例如对节点图标,节点间的连接线,以及树的展开状况等。利用 JTree 类的一线方法来定制树。

1,根节点手柄设置

默认设置:
在这里插入图片描述
如果不希望节点前面有手柄,设置tree.setRootVisible(false);
在这里插入图片描述
2,节点图标设置

方法 说明
setLeafIcon(Icon newIcon) 设置叶子节点图标
setClosedIcon(Icon newIcon) 设置节点处于折叠状态时的图标
setOpenIcon(Icon newIcon) 设置节点处于展开状态时的图标

3,节点连接线设置

默认设置:
在这里插入图片描述
如果不希望有连接线,设置tree.putClientProperty("JTree.lineStyle", "None");
在这里插入图片描述
如果设置成tree.putClientProperty("JTree.lineStyle","Horizontal");。则会变成水平分栏线。
在这里插入图片描述

五,维护树模型

在使用树时,有的时候需要提供对树的维护功能,例如增,删,改,查等操作,这些操作需要通过树模型类 DefaultTreeModel 来实现。

1,添加树节点
DefaultTreeModel 类中的 insertNodeInto() 方法可以向树模型中添加新节点。

insertNodelnto(MutableTreeNode newChild, MutableTreeNode parent, int index);

newChild:新添加的节点对象。
parent:新添加节点所在的父节点对象。
index:新添加节点的索引位置。

2,修改树节点
DefaultTreeModel 类的 nodeChangen() 方法用来对节点进行修改。

nodeChanged(treeNode);

treeNode:修改后的节点对象。

3,删除节点
DefaultTreeModel 类的 removeNodeFromParent() 方法用来删除树中以有的指定节点。

removeNodeFromParent(treeNode);

treeNode:需要删除的节点对象。

注意:树的根节点不允许删除,如果试图删除根节点时,会跑出异常。

猜你喜欢

转载自blog.csdn.net/javanofa/article/details/105968417
今日推荐