swing的JTree树

JTree、TreeModel实现树

树也是图形用户界面中使用非常广泛的GUI组件,例如使用Windows资源管理器时,将看到如下图所示的目录树:

计算机世界里的树是由一系列具有严格父子关系的节点组成的,每个节点既可以是其上一级节点的子节点,也可以是其下一级节点的父节点,因此同一个节点既可以是父节点,也可以是子节点(类似于一个人,他既是他儿子的父亲,又是他父亲的儿子)

按照结点是否包含子结点,可以把结点分为下面两类: 1、普通结点:包含子结点的结点 2、叶子结点:没有子结点的结点

按照结点是否具有唯一的父结点,可以把结点分为下面两类: 1、根结点:没有父结点的结点,计算机中,一棵树只能有一个根结点 2、普通结点:具有唯一父结点的结点 使用Swing里的Jtree、TreeModel及其相关的辅助类可以很轻松地开发出计算机世界里的树

 

创建树

Swing使用JTree对象来代表一棵树,JTree树中结点可以使用TreePath来标识,该对象封装了当前结点及其所有的父结点

当一个结点具有子结点时,该结点有两种状态: 1、展开状态:当父结点处于展开状态时,其子结点是可见的; 2、折叠状态: 当父结点处于折叠状态时,其子结点都是不可见的。 如果某个结点是可见的,则该结点的父结点(包括直接的、间接的父结点)都必须处于展开状态,只要有任意一个父结点处于折叠状态,该结点就是不可见的

 

JTree常用构造方法:

1、JTree(TreeModel newModel):使用指定的数据模型创建JTree对象,它默认显示根结点

2、JTree(TreeNode root):使用root作为根节点创建JTree对象,它默认显示根结点

3、JTree(TreeNode root, boolean asksAllowsChildren):使用root作为根结点创建JTree对象,它默认显示根结点asksAllowsChildren参数控制怎样的结点才算叶子结点,如果该参数为true,则只有当程序使用

4、setAllowsChildren(false)显式设置某个结点不允许添加子结点时(以后也不会拥有子结点) ,该结点才会被 JTree 当成叶子结点,如果该参数为false,则只要某个结点当时没有子结点(不管以后是否拥有子结点) ,该结点都会被JTree当成叶子结点

 

TreeNode继承体系及使用:

在构建目录树时,可以先创建很多DefaultMutableTreeNode对象,并调用他们的add方法构建好子父级结构,最后根据根结点构建一个JTree即可

 

 

swing的JTree树_基本使用

JTree的其他外观设置方法: 1、tree.putClientProperty( "JTree.lineStyle", "None"):设置结点之间没有连接线 2、tree.putClientProperty("JTree.lineStyle" , "Horizontal"):设置结点之间只有水平分割线 3、tree.setShowsRootHandles(true):设置根结点有"展开、折叠"图标 4、tree.setRootVisible(false):隐藏根结点

DefaultMutableTreeNode类其他成员方法:

方法作用
Enumeration breadthFirstEnumerationO/preorderEnumeration()按广度优先的顺序遍历以此结点为根的子树,并返回所有结点组成的枚举对象
Enumeration depthFirstEnumerationO/postorderEnumeration()按深度优先的顺序遍历以此结点为根的子树,并返回所有结点组成的枚举对象
DefaultMutableTreeNode getNextSibling()返回此结点的下一个兄弟结点
TreeNode getParent()返回此结点的父结点。如果此结点没有父结点,则返回null
TreeNode[] getPath()返回从根结点到达此结点的所有结点组成的数组
DefaultMutableTreeNode getPreviousSibling()返回此结点的上一个兄弟结点
TreeNode getRoot()返回包含此结点的树的根结点
TreeNode getSharedAncestor(DefaultMutableTreeNode aNode)返回此结点和aNode最近的共同祖先
int getSiblingCount()返回此结点的兄弟结点数
boolean isLeaf()返回该结点是否是叶子结点
boolean isNodeAncestor(TreeNode anotherNode)判断anotherNode是否是当前结点的祖先结点(包括父结点)
boolean isNodeChild(TreeNode aNode)如果aNode是此结点的子结点,则返回true
boolean isNodeDescendant(DefaultMutableTreeNode anotherNode)如果anotherNode是此结点的后代,包括是此结点本身、此结点的子结点或此结点的子结点的后代,都将返回true
boolean isNodeRelated(DefaultMutableTreeNode aNode)当aNode和当前结点位于同一棵树中时返回true
boolean isNodeSibling(TreeNode anotherNode)返回anotherNode是否是当前结点的兄弟结点
boolean isRoot()返回当前结点是否是根结点
Enumeration pathFromAncestorEnumeration(TreeNode ancestor)返回从指定祖先结点到当前结点的所有结点组成的枚举对象

 

swing的JTree树_基本使用的练习