By cszhao1980
同JTable类似,JTree也是一个负责的组件,其周围也有大量附属接口、类,如下图所示:
TreeNode是JTree的核心组成部分,通过TreeNode实现了Tree的基本结构。
swing提供了三个相关的接口和类。
接口总结20-1 TreeNode |
public abstract Enumeration children() —— 枚举children
public abstract TreeNode getParent() —— 获取父节点
public abstract TreeNode getChildAt(int) —— 每个节点都有index,根据index获取节点
public abstract int getChildCount() —— children数量
public abstract int getIndex(TreeNode) —— 根据节点获取index
public abstract boolean getAllowsChildren()
public abstract boolean isLeaf()
最后两个方法用来确定一个节点是文件夹,还是树叶:
(1) isLeaf()——只要此节点没有children,就返回true;
(2) getAllowsChildren()——表示是否可以拥有children,而不是目前是否拥有children。
接口总结20-2 MutableTreeNode |
扩展:TreeNode
public abstract void insert(MutableTreeNode child, int index)
public abstract void remove(int index)
public abstract void remove(MutableTreeNode child)
public abstract void removeFromParent()
public abstract void setParent(MutableTreeNode)
public abstract void setUserObject(Object)
上面列出的第一组方法用来插入和删除子节点,子节点可以通过索引或引用来删除。removeFromParent方法用来将节点从父节点中删除,并更新父节点的子节点数目。
上面列出的最后两个方法用来设置一个节点的父节点和用户对象(UserObject)。
一般情况下,UserObject是构成“树节点”的“业务”数据,比如,该节点记录了Integer、double、或String,则userObject就分别是这三种Object。比如,DefaultMutableTreeNode就定义了两个使用UserObject来进行初始化的构造函数。
DefaultMutableTreeNode类
开发人员很少直接实现TreeNode接口,这是因为Swing在DefaultMutableTreeNode类中提供了TreeNode接口的一个常用的缺省实现。数目众多的树节点扩展了DefaultMutableTreeNode。
构造方法摘要 |
|
DefaultMutableTreeNode() |
|
DefaultMutableTreeNode(Object userObject) |
|
DefaultMutableTreeNode(Object userObject, boolean allowsChildren) |
|
除了接口定义的各种方法外,该类还实现了一些其他的方法,方便使用:
void |
add(MutableTreeNode newChild) |
TreeNode |
getFirstChild() |
DefaultMutableTreeNode |
getFirstLeaf() |
TreeNode |
getLastChild() |
DefaultMutableTreeNode |
getLastLeaf() |
DefaultMutableTreeNode |
getNextLeaf() |
DefaultMutableTreeNode |
getNextNode |
TreeNode[] |
getPath() |
|
getUserObject |
JTree的TreeNode设计非常成功,比如,swing.pdf有一个例子,扩展DefaultMutableTreeNode实现文件导航器,短短几十行代码就完成了,十分的漂亮。
TreePath类表示TreeNode的路径,它的内部实现其实是一个Objects 数组,每个成员都是一个TreeNode。
一般来说,我们不直接生成TreePath,而是通过TreeNode实现类(如DefaultMutableTreeNode)获取Path。
方法摘要 |
|
Object |
getLastPathComponent() (即节点自身) |
TreePath |
getParentPath() (即父节点的路径) |
Object[] |
getPath() |
Object |
getPathComponent(int element) |
int |
getPathCount() |
boolean |
isDescendant(TreePath aTreePath) |
TreePath |
pathByAddingChild(Object child) |
boolean |
equals(Object o) |