public class DefaultMutableTreeNode extends Object implements Cloneable, MutableTreeNode, Serializable
DefaultMutableTreeNode
是树状数据结构中的通用节点。
有关使用默认可变树节点的示例,请参阅Java教程中的 How to Use Trees 。
树节点最多可能有一个父节点和0个或更多的子节点。 DefaultMutableTreeNode
提供了检查和修改节点的父和子节点的操作,以及检查节点是其中一部分的树的操作。 节点的树是通过从节点开始并跟随所有可能的链接到父母和子节点的所有节点的集合。 没有父节点的节点是其树的根; 没有孩子的节点是叶子。 树可以由许多子树组成,每个节点充当其子树的根。
该类提供了用于以各种顺序有效地遍历树或子树的枚举,或用于跟踪两个节点之间的路径。 A DefaultMutableTreeNode
还可以保存对用户对象的引用,其对用户的使用。 DefaultMutableTreeNode
一个DefaultMutableTreeNode
的字符串表示与toString()
返回其用户对象的字符串表示。
这不是一个线程安全的类。 如果您打算在多个线程中使用DefaultMutableTreeNode(或TreeNodes树),则需要自己进行同步。 一个很好的惯例是在树的根节点上进行同步。
虽然DefaultMutableTreeNode实现MutableTreeNode接口,并允许您添加MutableTreeNode的任何实现,但DefaultMutableTreeNode中的所有方法都不适用于所有MutableTreeNodes实现。 特别是提供了一些枚举,使用这些方法中的一些假定DefaultMutableTreeNode仅包含DefaultMutableNode实例。 所有的TreeNode / MutableTreeNode方法将按照定义的行为,无论添加什么实现。
警告:此类的序列化对象与将来的Swing版本不兼容。 当前的序列化支持适用于运行相同版本的Swing的应用程序之间的短期存储或RMI。 从1.4开始,支持所有JavaBeans的长期存储已经添加到java.beans
包中。 请参阅XMLEncoder
。
MutableTreeNode
Modifier and Type | Field and Description |
---|---|
protected boolean |
allowsChildren
如果节点能够拥有子节点,则为true
|
protected Vector |
children
如果此节点没有子节点,则可能为null
|
static Enumeration<TreeNode> |
EMPTY_ENUMERATION
一个总是空的枚举。
|
protected MutableTreeNode |
parent
该节点的父节点,如果此节点没有父节点,则为null
|
protected Object |
userObject
可选的用户对象
|
Constructor and Description |
---|
DefaultMutableTreeNode()
创建一个树节点,没有父节点,没有子节点,但它允许子节点。
|
DefaultMutableTreeNode(Object userObject)
创建一个没有父进程,没有子节点,但允许子节点的树节点,并用指定的用户对象初始化它。
|
DefaultMutableTreeNode(Object userObject, boolean allowsChildren)
创建一个没有父进程的树节点,没有子节点,用指定的用户对象进行初始化,只有在指定的时候才允许子节点。
|
Modifier and Type | Method and Description |
---|---|
void |
add(MutableTreeNode newChild)
从父节点删除
newChild 并将其添加到该节点的子数组的末尾,使其成为该节点的子节点。
|
Enumeration |
breadthFirstEnumeration()
创建并返回以宽度优先顺序遍历以此节点为根的子树的枚举。
|
Enumeration |
children()
创建并返回该节点的子节点的前向枚举。
|
Object |
clone()
覆盖使克隆公开。
|
Enumeration |
depthFirstEnumeration()
创建并返回以深度优先顺序遍历以此节点为根的子树的枚举。
|
boolean |
getAllowsChildren()
如果该节点允许有子节点,则返回true。
|
TreeNode |
getChildAfter(TreeNode aChild)
返回紧跟在此节点的子节点数组孩子
aChild ,它必须是此节点的子节点。
|
TreeNode |
getChildAt(int index)
返回此节点的子数组中指定索引处的子节点。
|
TreeNode |
getChildBefore(TreeNode aChild)
返回此节点的子节点数组的孩子,紧接
aChild ,它必须是此节点的子节点。
|
int |
getChildCount()
返回此节点的子节点数。
|
int |
getDepth()
返回根据此节点的树的深度 - 从该节点到叶片的最长距离。
|
TreeNode |
getFirstChild()
返回此节点的第一个子节点。
|
DefaultMutableTreeNode |
getFirstLeaf()
找到并返回作为此节点的后代的第一个叶 - 该节点或其第一个孩子的第一个叶子。
|
int |
getIndex(TreeNode aChild)
返回此节点的子数组中指定子节点的索引。
|
TreeNode |
getLastChild()
返回此节点的最后一个子节点。
|
DefaultMutableTreeNode |
getLastLeaf()
查找并返回作为此节点的后代的最后一个叶 - 该节点或其最后一个子节点的最后一个叶。
|
int |
getLeafCount()
返回作为该节点后代的树叶总数。
|
int |
getLevel()
返回此节点以上的级别数 - 从根到该节点的距离。
|
DefaultMutableTreeNode |
getNextLeaf()
返回此节点之后的叶,如果此节点是树中的最后一个叶,则返回null。
|
DefaultMutableTreeNode |
getNextNode()
在此节点的树的预序遍历中返回此节点后面的节点。
|
DefaultMutableTreeNode |
getNextSibling()
返回父节点的子节点数组中该节点的下一个兄弟节点。
|
TreeNode |
getParent()
返回此节点的父节点,如果此节点没有父节点,则返回null。
|
TreeNode[] |
getPath()
从根返回路径,以获取到此节点。
|
protected TreeNode[] |
getPathToRoot(TreeNode aNode, int depth)
构建节点直到并包括根节点的父节点,其中原始节点是返回的数组中的最后一个元素。
|
DefaultMutableTreeNode |
getPreviousLeaf()
返回此节点之前的叶子,如果此节点是树中的第一个叶子,则返回null。
|
DefaultMutableTreeNode |
getPreviousNode()
在此节点的树的预序遍历中返回此节点之前的节点。
|
DefaultMutableTreeNode |
getPreviousSibling()
返回父节点的子节点中此节点的前一个同级节点。
|
TreeNode |
getRoot()
返回包含此节点的树的根。
|
TreeNode |
getSharedAncestor(DefaultMutableTreeNode aNode)
返回此节点最近的共同祖先,并
aNode 。
|
int |
getSiblingCount()
返回此节点的兄弟节点数。
|
Object |
getUserObject()
返回此节点的用户对象。
|
Object[] |
getUserObjectPath()
从根中返回用户对象路径,以获取到此节点。
|
void |
insert(MutableTreeNode newChild, int childIndex)
从其当前父项(如果它有父)删除
newChild ,将子节点的父节点设置为此节点,然后将子节点添加到索引
childIndex 中的该节点的子数组。
|
boolean |
isLeaf()
如果此节点没有子节点,则返回true。
|
boolean |
isNodeAncestor(TreeNode anotherNode)
如果
anotherNode 是此节点的祖先 - 如果是此节点,此节点的父节点或此节点的父节点的祖先,则返回true。
|
boolean |
isNodeChild(TreeNode aNode)
如果
aNode 是此节点的子节点,则返回true。
|
boolean |
isNodeDescendant(DefaultMutableTreeNode anotherNode)
如果
anotherNode 是此节点的后代 - 如果是此节点,此节点的子节点之一,或该节点的子节点之一,则返回true。
|
boolean |
isNodeRelated(DefaultMutableTreeNode aNode)
当且仅当
aNode 与该节点在同一棵树中时,返回true。
|
boolean |
isNodeSibling(TreeNode anotherNode)
如果
anotherNode 是这个节点的(与父节点相同)的兄弟,则返回true。
|
boolean |
isRoot()
如果此节点是树的根,则返回true。
|
Enumeration |
pathFromAncestorEnumeration(TreeNode ancestor)
创建并返回从
ancestor 到此节点的路径
ancestor 。
|
Enumeration |
postorderEnumeration()
创建并返回在postorder中遍历此节点的子树的枚举。
|
Enumeration |
preorderEnumeration()
创建并返回以预订方式遍历此节点的子树的枚举。
|
void |
remove(int childIndex)
从该节点的子节点删除指定索引处的子节点,并将该节点的父节点设置为null。
|
void |
remove(MutableTreeNode aChild)
从此节点的子数组中删除
aChild ,给它一个空父项。
|
void |
removeAllChildren()
删除所有这个节点的孩子,将他们的父母设置为null。
|
void |
removeFromParent()
从树中除去根节点的子树,给这个节点一个空父。
|
void |
setAllowsChildren(boolean allows)
确定此节点是否允许有子节点。
|
void |
setParent(MutableTreeNode newParent)
将此节点的父节点设置为
newParent 但不会更改父节点的子数组。
|
void |
setUserObject(Object userObject)
将此节点的用户对象设置为
userObject 。
|
String |
toString()
返回向该节点的用户对象发送
toString() 的结果,如果节点没有用户对象,则返回空字符串。
|
public static final Enumeration<TreeNode> EMPTY_ENUMERATION
protected MutableTreeNode parent
protected Vector children
protected transient Object userObject
protected boolean allowsChildren
public DefaultMutableTreeNode()
public DefaultMutableTreeNode(Object userObject)
userObject
- 由用户提供的构成节点数据的对象
public DefaultMutableTreeNode(Object userObject, boolean allowsChildren)
userObject
- 由用户提供的构成节点数据的对象
allowsChildren
- 如果为true,则允许该节点具有子节点 - 否则它始终是叶节点
public void insert(MutableTreeNode newChild, int childIndex)
newChild
,将子节点的父节点设置为此节点,然后将子节点添加到索引childIndex
中的该节点的子数组。
newChild
不能为空,不能是此节点的祖先。
insert
在界面
MutableTreeNode
newChild
- 在此节点下插入的MutableTreeNode
childIndex
- 此节点的子阵列中要插入此节点的索引
ArrayIndexOutOfBoundsException
- 如果
childIndex
超出范围
IllegalArgumentException
- 如果
newChild
为空或是此节点的祖先
IllegalStateException
- 如果此节点不允许孩子
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public void remove(int childIndex)
MutableTreeNode
。
remove
在接口
MutableTreeNode
childIndex
- 要删除的子节点的此节点的子数组中的索引
ArrayIndexOutOfBoundsException
- 如果
childIndex
超出范围
public void setParent(MutableTreeNode newParent)
newParent
但不会更改父节点的子数组。
这种方法从insert()
和remove()
,重新分配一个孩子的父母,它不应该从任何其他地方消息。
setParent
在接口
MutableTreeNode
newParent
- 这个节点的新父
public TreeNode getParent()
public TreeNode getChildAt(int index)
getChildAt
在接口
TreeNode
index
- 此节点的子数组的索引
ArrayIndexOutOfBoundsException
- 如果
index
超出范围
public int getChildCount()
getChildCount
在界面
TreeNode
public int getIndex(TreeNode aChild)
-1
。
该方法执行线性搜索,并且是O(n),其中n是子数。
getIndex
在界面
TreeNode
aChild
- 在该节点的子节点之间搜索的TreeNode
-1
IllegalArgumentException
- 如果
aChild
为null
public Enumeration children()
public void setAllowsChildren(boolean allows)
allows
为false,则删除该节点的所有子节点。
注意:默认情况下,一个节点允许孩子。
allows
- 如果该节点允许有子节点,则为true
public boolean getAllowsChildren()
getAllowsChildren
在接口
TreeNode
public void setUserObject(Object userObject)
userObject
。
setUserObject
在接口
MutableTreeNode
userObject
- 构成该节点用户指定数据的对象
getUserObject()
,
toString()
public Object getUserObject()
setUserObject(java.lang.Object)
,
toString()
public void removeFromParent()
removeFromParent
在界面
MutableTreeNode
public void remove(MutableTreeNode aChild)
aChild
,给它一个空父。
remove
在接口
MutableTreeNode
aChild
- 此节点的子节点要删除
IllegalArgumentException
- 如果
aChild
为空或不是此节点的子节点
public void removeAllChildren()
public void add(MutableTreeNode newChild)
newChild
并将其添加到该节点的子数组的末尾,使其成为该节点的子节点。
newChild
- 要作为此节点的子节点添加的节点
IllegalArgumentException
- 如果
newChild
为空
IllegalStateException
- 如果此节点不允许孩子
insert(javax.swing.tree.MutableTreeNode, int)
public boolean isNodeAncestor(TreeNode anotherNode)
anotherNode
是此节点的祖先 - 如果是此节点,此节点的父节点或此节点的父节点的祖先,则返回true。
(注意,一个节点被认为是自己的祖先。)如果anotherNode
为null,则此方法返回false。
此操作处于最差O(h),其中h是从根到该节点的距离。
anotherNode
- 要作为此节点的祖先进行测试的节点
anotherNode
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
,
getSharedAncestor(javax.swing.tree.DefaultMutableTreeNode)
public boolean isNodeDescendant(DefaultMutableTreeNode anotherNode)
anotherNode
是此节点的后代 - 如果是该节点,该节点的子节点之一,或该节点的子节点之一,则返回true。
请注意,节点被认为是其本身的后代。
如果anotherNode
为null,则返回false。
这个操作是最差的O(h),其中h是从根到anotherNode
的距离。
anotherNode
- 要作为此节点的后代进行测试的节点
anotherNode
的祖先,
anotherNode
isNodeAncestor(javax.swing.tree.TreeNode)
,
getSharedAncestor(javax.swing.tree.DefaultMutableTreeNode)
public TreeNode getSharedAncestor(DefaultMutableTreeNode aNode)
aNode
。
如果不存在这样的祖先 - 如果此节点和aNode
在不同的树中,或者如果aNode
为空,则返回null。
节点被认为是自己的祖先。
aNode
- 找到共同祖先的节点
aNode
,如果没有,则返回null
isNodeAncestor(javax.swing.tree.TreeNode)
,
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public boolean isNodeRelated(DefaultMutableTreeNode aNode)
aNode
与该节点在同一棵树中时返回true。
如果aNode
为空,则返回false。
aNode
与该节点在同一棵树中,则为true;
如果aNode
为空,则为false
getSharedAncestor(javax.swing.tree.DefaultMutableTreeNode)
,
getRoot()
public int getDepth()
getLevel()
要贵得多,因为它必须有效地遍历以该节点为根的整个树。
getLevel()
public int getLevel()
getDepth()
public TreeNode[] getPath()
protected TreeNode[] getPathToRoot(TreeNode aNode, int depth)
aNode
- 获取路径的TreeNode
depth
- 一个int给出已经对根(在递归调用)上已经采取的步骤的数量,用于调整返回的数组的大小
public Object[] getUserObjectPath()
public TreeNode getRoot()
isNodeAncestor(javax.swing.tree.TreeNode)
public boolean isRoot()
public DefaultMutableTreeNode getNextNode()
preorderEnumeration()
public DefaultMutableTreeNode getPreviousNode()
null
的第一个节点(树根),则返回null
。
这是遍历整个树的低效方法;
使用枚举,而不是。
preorderEnumeration()
public Enumeration preorderEnumeration()
nextElement()
方法返回的第一个节点。
通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举无效。
postorderEnumeration()
public Enumeration postorderEnumeration()
nextElement()
方法返回的第一个节点是最左边的叶子。
这与深度优先遍历相同。
通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举无效。
depthFirstEnumeration()
,
preorderEnumeration()
public Enumeration breadthFirstEnumeration()
nextElement()
方法返回的第一个节点。
通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举无效。
depthFirstEnumeration()
public Enumeration depthFirstEnumeration()
nextElement()
方法返回的第一个节点是最左边的叶。
这与后期遍历相同。
通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举无效。
breadthFirstEnumeration()
,
postorderEnumeration()
public Enumeration pathFromAncestorEnumeration(TreeNode ancestor)
ancestor
到此节点的路径ancestor
。
枚举的nextElement()
方法首先返回ancestor
,然后是ancestor
的子节点,这是该节点的祖先,等等,最后返回此节点。
枚举的创建是O(m),其中m是该节点与ancestor
之间的节ancestor
,包括端点数。
每个nextElement()
消息是O(1)。
通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举无效。
IllegalArgumentException
- 如果
ancestor
不是此节点的祖先
isNodeAncestor(javax.swing.tree.TreeNode)
,
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public boolean isNodeChild(TreeNode aNode)
aNode
是此节点的子节点,则返回true。
如果aNode
为null,则此方法返回false。
aNode
是此节点的子节点,则为true;
如果aNode
为空,则为false
public TreeNode getFirstChild()
NoSuchElementException
- 如果此节点没有子节点
public TreeNode getLastChild()
NoSuchElementException
- 如果此节点没有子节点
public TreeNode getChildAfter(TreeNode aChild)
aChild
,它必须是此节点的子节点。
如果最后一个小孩为aChild
,则返回null。
该方法对该节点的子节点进行线性搜索,为aChild
,为O(n),其中n为子节点数;
遍历整个子系列,改用枚举。
aChild
IllegalArgumentException
- 如果
aChild
为null或不是此节点的子节点
children
public TreeNode getChildBefore(TreeNode aChild)
aChild
,它必须是此节点的子节点。
如果aChild
是第一个孩子,则返回null。
该方法对该节点的子节点进行线性搜索,为aChild
,为O(n),其中n为子节点数。
aChild
之前
IllegalArgumentException
- 如果
aChild
为空或不是此节点的子节点
public boolean isNodeSibling(TreeNode anotherNode)
anotherNode
与此节点(具有相同的父节点)的兄弟节点,则返回true。
一个节点是自己的兄弟姐妹。
如果anotherNode
为null,则返回false。
anotherNode
- 要测试该节点的兄弟节点
anotherNode
是此节点的兄弟节点,则为true
public int getSiblingCount()
1
)。
public DefaultMutableTreeNode getNextSibling()
children
public DefaultMutableTreeNode getPreviousSibling()
public boolean isLeaf()
getAllowsChildren
isLeaf
在接口
TreeNode
getAllowsChildren()
public DefaultMutableTreeNode getFirstLeaf()
isLeaf()
,
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public DefaultMutableTreeNode getLastLeaf()
isLeaf()
,
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public DefaultMutableTreeNode getNextLeaf()
在这个MutableNode MutableNode
实现中,这个操作是非常低效的。 为了确定下一个节点,该方法首先在父子列表中执行线性搜索,以便查找当前节点。
该实现使得操作适合于从已知位置的短遍历。 但是要遍历树中的所有树叶,您应该使用depthFirstEnumeration
枚举树中的节点,并在每个节点上使用isLeaf
来确定哪些是叶。
depthFirstEnumeration()
,
isLeaf()
public DefaultMutableTreeNode getPreviousLeaf()
在这个MutableNode MutableNode
实现中,这个操作是非常低效的。 为了确定先前的节点,该方法首先在父子列表中执行线性搜索,以便查找当前节点。
该实现使得操作适合于从已知位置的短遍历。 但要遍历树中的所有树叶,您应该使用depthFirstEnumeration
枚举树中的节点,并在每个节点上使用isLeaf
来确定哪些是叶。
depthFirstEnumeration()
,
isLeaf()
public int getLeafCount()
1
。
该方法是O(n),其中n是该节点的后代数。
isNodeAncestor(javax.swing.tree.TreeNode)
public String toString()
toString()
的结果,如果节点没有用户对象,则返回空字符串。
toString
在
Object
getUserObject()