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即可
package ch30;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
public class a_24_0swing_树_JTree {
JFrame jf = new JFrame("简单树");
//创建JTree对象
JTree tree;
DefaultMutableTreeNode root;
DefaultMutableTreeNode guangdong;
DefaultMutableTreeNode guangxi;
DefaultMutableTreeNode foshan;
DefaultMutableTreeNode shantou;
DefaultMutableTreeNode guilin;
DefaultMutableTreeNode nanning;
public void init() {
//创建DefaultMutableTreeNode对象代表节点
root = new DefaultMutableTreeNode("中国");
guangdong = new DefaultMutableTreeNode("广东");
guangxi = new DefaultMutableTreeNode("广西");
foshan = new DefaultMutableTreeNode("佛山");
shantou = new DefaultMutableTreeNode("汕头");
guilin = new DefaultMutableTreeNode("桂林");
nanning = new DefaultMutableTreeNode("南宁");
//通过add()方法,组装结点之间的关系
//广东和广西是中国的子节点
root.add(guangdong);
root.add(guangxi);
//佛山和汕头是广东的子节点
guangdong.add(foshan);
guangdong.add(shantou);
//桂林和南宁是广西的子节点
guangxi.add(guilin);
guangxi.add(nanning);
//依据根结点,创建JTree。即中国root是根节点
JTree tree = new JTree(root);
//把根节点放到jf窗口里面,new JScrollPane()是给根节点加滚动条
jf.add(new JScrollPane(tree));
//设置窗口的最佳大小,设置窗口可见,设置点击叉号就退出程序
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new a_24_0swing_树_JTree().init();
}
}
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树_基本使用的练习
xxxxxxxxxx
package ch30;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
public class a_25_0swing_树_JTree基本使用 {
JFrame jf = new JFrame("简单树");
//创建JTree对象
JTree tree;
DefaultMutableTreeNode root;
DefaultMutableTreeNode guangdong;
DefaultMutableTreeNode guangxi;
DefaultMutableTreeNode foshan;
DefaultMutableTreeNode shantou;
DefaultMutableTreeNode guilin;
DefaultMutableTreeNode nanning;
public void init() {
//创建DefaultMutableTreeNode对象代表节点
root = new DefaultMutableTreeNode("中国");
guangdong = new DefaultMutableTreeNode("广东");
guangxi = new DefaultMutableTreeNode("广西");
foshan = new DefaultMutableTreeNode("佛山");
shantou = new DefaultMutableTreeNode("汕头");
guilin = new DefaultMutableTreeNode("桂林");
nanning = new DefaultMutableTreeNode("南宁");
//通过add()方法,组装结点之间的关系
//广东和广西是中国的子节点
root.add(guangdong);
root.add(guangxi);
//佛山和汕头是广东的子节点
guangdong.add(foshan);
guangdong.add(shantou);
//桂林和南宁是广西的子节点
guangxi.add(guilin);
guangxi.add(nanning);
//依据根结点,创建JTree。即中国root是根节点
JTree tree = new JTree(root);
//------------------------------------------------------------------------------------------------
//注意下面虚线里面的就是我们这节课的代码,其它的是上一节课的代码
//设置结点之间没有连接线
tree.putClientProperty( "JTree.lineStyle", "None");
//设置结点之间只有水平分割线。这个和上面那个是关于分割线的用法,只能使用其中一个,另一个注释掉
//tree.putClientProperty("JTree.lineStyle" , "Horizontal");
//返回guangdong结点的下一个兄弟结点
DefaultMutableTreeNode nextNode = guangdong.getNextSibling();
System.out.println("广东结点的下一个兄弟结点是: "+nextNode);
System.out.println();
//返回此结点的父结点。如果此结点没有父结点,则返回null
TreeNode parent = guangdong.getParent();
System.out.println("广东结点的父结点是: "+parent);
System.out.println();
//返回该结点是否是叶子结点
System.out.println("广东是否是叶子节点: "+guangdong.isLeaf());
System.out.println("佛山是否是叶子节点: "+foshan.isLeaf());
System.out.println();
//返回当前结点是否是根结点
System.out.println("广东是否是根节点: "+guangdong.isRoot());
System.out.println("佛山是否是根节点: "+foshan.isRoot());
System.out.println("中国是否是根节点: "+root.isRoot());
//------------------------------------------------------------------------------------------------
//把根节点放到jf窗口里面,new JScrollPane()是给根节点加滚动条
jf.add(new JScrollPane(tree));
//设置窗口的最佳大小,设置窗口可见,设置点击叉号就退出程序
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new a_25_0swing_树_JTree基本使用().init();
}
}