树状结构是一种常用的信息表现形式,它可以直观的显示出一组信息的层次结构。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:需要删除的节点对象。
注意:树的根节点不允许删除,如果试图删除根节点时,会跑出异常。