public class DefaultMutableTreeNode extends Objectimplements Cloneable , MutableTreeNode , Serializable
DefaultMutableTreeNode is a general-purpose node in a tree data structure. For examples of using default mutable tree nodes, see
How to Use Trees in
The Java Tutorial.
A tree node may have at most one parent and 0 or more children. DefaultMutableTreeNode provides operations for examining and modifying a node's parent and children and also operations for examining the tree that the node is a part of. A node's tree is the set of all nodes that can be reached by starting at the node and following all the possible links to parents and children. A node with no parent is the root of its tree; a node with no children is a leaf. A tree may consist of many subtrees, each node acting as the root for its own subtree.
This class provides enumerations for efficiently traversing a tree or subtree in various orders or for following the path between two nodes. A DefaultMutableTreeNode may also hold a reference to a user object, the use of which is left to the user. Asking a DefaultMutableTreeNode for its string representation with toString() returns the string representation of its user object.
This is not a thread safe class.If you intend to use a DefaultMutableTreeNode (or a tree of TreeNodes) in more than one thread, you need to do your own synchronizing. A good convention to adopt is synchronizing on the root node of a tree.
While DefaultMutableTreeNode implements the MutableTreeNode interface and will allow you to add in any implementation of MutableTreeNode not all of the methods in DefaultMutableTreeNode will be applicable to all MutableTreeNodes implementations. Especially with some of the enumerations that are provided, using some of these methods assumes the DefaultMutableTreeNode contains only DefaultMutableNode instances. All of the TreeNode/MutableTreeNode methods will behave as defined no matter what implementations are added.
Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, support for long term storage of all JavaBeans™ has been added to the java.beans package. Please see XMLEncoder.
MutableTreeNode
| Modifier and Type | Field and Description |
|---|---|
protected boolean |
allowsChildren
true if the node is able to have children
|
protected Vector |
children
array of children, may be null if this node has no children
|
static Enumeration |
EMPTY_ENUMERATION
An enumeration that is always empty.
|
protected MutableTreeNode |
parent
this node's parent, or null if this node has no parent
|
protected Object |
userObject
optional user object
|
| Constructor and Description |
|---|
DefaultMutableTreeNode()
Creates a tree node that has no parent and no children, but which allows children.
|
DefaultMutableTreeNode(Object
Creates a tree node with no parent, no children, but which allows children, and initializes it with the specified user object.
|
DefaultMutableTreeNode(Object
Creates a tree node with no parent, no children, initialized with the specified user object, and that allows children only if specified.
|
| Modifier and Type | Method and Description |
|---|---|
void |
add(MutableTreeNode
Removes
newChild from its parent and makes it a child of this node by adding it to the end of this node's child array.
|
Enumeration |
breadthFirstEnumeration()
Creates and returns an enumeration that traverses the subtree rooted at this node in breadth-first order.
|
Enumeration |
children()
Creates and returns a forward-order enumeration of this node's children.
|
Object |
clone()
Overridden to make clone public.
|
Enumeration |
depthFirstEnumeration()
Creates and returns an enumeration that traverses the subtree rooted at this node in depth-first order.
|
boolean |
getAllowsChildren()
Returns true if this node is allowed to have children.
|
TreeNode |
getChildAfter(TreeNode
Returns the child in this node's child array that immediately follows
aChild, which must be a child of this node.
|
TreeNode |
getChildAt(int index)
Returns the child at the specified index in this node's child array.
|
TreeNode |
getChildBefore(TreeNode
Returns the child in this node's child array that immediately precedes
aChild, which must be a child of this node.
|
int |
getChildCount()
Returns the number of children of this node.
|
int |
getDepth()
Returns the depth of the tree rooted at this node -- the longest distance from this node to a leaf.
|
TreeNode |
getFirstChild()
Returns this node's first child.
|
DefaultMutableTreeNode |
getFirstLeaf()
Finds and returns the first leaf that is a descendant of this node -- either this node or its first child's first leaf.
|
int |
getIndex(TreeNode
Returns the index of the specified child in this node's child array.
|
TreeNode |
getLastChild()
Returns this node's last child.
|
DefaultMutableTreeNode |
getLastLeaf()
Finds and returns the last leaf that is a descendant of this node -- either this node or its last child's last leaf.
|
int |
getLeafCount()
Returns the total number of leaves that are descendants of this node.
|
int |
getLevel()
Returns the number of levels above this node -- the distance from the root to this node.
|
DefaultMutableTreeNode |
getNextLeaf()
Returns the leaf after this node or null if this node is the last leaf in the tree.
|
DefaultMutableTreeNode |
getNextNode()
Returns the node that follows this node in a preorder traversal of this node's tree.
|
DefaultMutableTreeNode |
getNextSibling()
Returns the next sibling of this node in the parent's children array.
|
TreeNode |
getParent()
Returns this node's parent or null if this node has no parent.
|
TreeNode |
getPath()
Returns the path from the root, to get to this node.
|
protected TreeNode |
getPathToRoot(TreeNode
Builds the parents of node up to and including the root node, where the original node is the last element in the returned array.
|
DefaultMutableTreeNode |
getPreviousLeaf()
Returns the leaf before this node or null if this node is the first leaf in the tree.
|
DefaultMutableTreeNode |
getPreviousNode()
Returns the node that precedes this node in a preorder traversal of this node's tree.
|
DefaultMutableTreeNode |
getPreviousSibling()
Returns the previous sibling of this node in the parent's children array.
|
TreeNode |
getRoot()
Returns the root of the tree that contains this node.
|
TreeNode |
getSharedAncestor(DefaultMutableTreeNode
Returns the nearest common ancestor to this node and
aNode.
|
int |
getSiblingCount()
Returns the number of siblings of this node.
|
Object |
getUserObject()
Returns this node's user object.
|
Object |
getUserObjectPath()
Returns the user object path, from the root, to get to this node.
|
void |
insert(MutableTreeNode
Removes
newChild from its present parent (if it has a parent), sets the child's parent to this node, and then adds the child to this node's child array at index
childIndex.
|
boolean |
isLeaf()
Returns true if this node has no children.
|
boolean |
isNodeAncestor(TreeNode
Returns true if
anotherNode is an ancestor of this node -- if it is this node, this node's parent, or an ancestor of this node's parent.
|
boolean |
isNodeChild(TreeNode
Returns true if
aNode is a child of this node.
|
boolean |
isNodeDescendant(DefaultMutableTreeNode
Returns true if
anotherNode is a descendant of this node -- if it is this node, one of this node's children, or a descendant of one of this node's children.
|
boolean |
isNodeRelated(DefaultMutableTreeNode
Returns true if and only if
aNode is in the same tree as this node.
|
boolean |
isNodeSibling(TreeNode
Returns true if
anotherNode is a sibling of (has the same parent as) this node.
|
boolean |
isRoot()
Returns true if this node is the root of the tree.
|
Enumeration |
pathFromAncestorEnumeration(TreeNode
Creates and returns an enumeration that follows the path from
ancestor to this node.
|
Enumeration |
postorderEnumeration()
Creates and returns an enumeration that traverses the subtree rooted at this node in postorder.
|
Enumeration |
preorderEnumeration()
Creates and returns an enumeration that traverses the subtree rooted at this node in preorder.
|
void |
remove(int childIndex)
Removes the child at the specified index from this node's children and sets that node's parent to null.
|
void |
remove(MutableTreeNode
Removes
aChild from this node's child array, giving it a null parent.
|
void |
removeAllChildren()
Removes all of this node's children, setting their parents to null.
|
void |
removeFromParent()
Removes the subtree rooted at this node from the tree, giving this node a null parent.
|
void |
setAllowsChildren(boolean allows)
Determines whether or not this node is allowed to have children.
|
void |
setParent(MutableTreeNode
Sets this node's parent to
newParent but does not change the parent's child array.
|
void |
setUserObject(Object
Sets the user object for this node to
userObject.
|
String |
toString()
Returns the result of sending
toString() to this node's user object, or the empty string if the node has no user object.
|
public static final Enumeration<TreeNode > EMPTY_ENUMERATION
protected MutableTreeNodeparent
protected Vectorchildren
protected transient ObjectuserObject
protected boolean allowsChildren
public DefaultMutableTreeNode()
public DefaultMutableTreeNode(ObjectuserObject)
userObject - an Object provided by the user that constitutes the node's data
public DefaultMutableTreeNode(ObjectuserObject, boolean allowsChildren)
userObject - an Object provided by the user that constitutes the node's data
allowsChildren - if true, the node is allowed to have child nodes -- otherwise, it is always a leaf node
public void insert(MutableTreeNodenewChild, int childIndex)
newChild from its present parent (if it has a parent), sets the child's parent to this node, and then adds the child to this node's child array at index
childIndex.
newChild must not be null and must not be an ancestor of this node.
insert in interface
MutableTreeNode
newChild - the MutableTreeNode to insert under this node
childIndex - the index in this node's child array where this node is to be inserted
ArrayIndexOutOfBoundsException - if
childIndex is out of bounds
IllegalArgumentException - if
newChild is null or is an ancestor of this node
IllegalStateException - if this node does not allow children
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public void remove(int childIndex)
MutableTreeNode.
remove in interface
MutableTreeNode
childIndex - the index in this node's child array of the child to remove
ArrayIndexOutOfBoundsException - if
childIndex is out of bounds
public void setParent(MutableTreeNodenewParent)
newParent but does not change the parent's child array. This method is called from
insert() and
remove() to reassign a child's parent, it should not be messaged from anywhere else.
setParent in interface
MutableTreeNode
newParent - this node's new parent
public TreeNodegetParent()
public TreeNodegetChildAt(int index)
getChildAt in interface
TreeNode
index - an index into this node's child array
ArrayIndexOutOfBoundsException - if
index is out of bounds
public int getChildCount()
getChildCount in interface
TreeNode
public int getIndex(TreeNodeaChild)
-1. This method performs a linear search and is O(n) where n is the number of children.
getIndex in interface
TreeNode
aChild - the TreeNode to search for among this node's children
-1 if the specified node is a not a child of this node
IllegalArgumentException - if
aChild is null
public Enumerationchildren()
public void setAllowsChildren(boolean allows)
allows is false, all of this node's children are removed.
Note: By default, a node allows children.
allows - true if this node is allowed to have children
public boolean getAllowsChildren()
getAllowsChildren in interface
TreeNode
public void setUserObject(ObjectuserObject)
userObject.
setUserObject in interface
MutableTreeNode
userObject - the Object that constitutes this node's user-specified data
getUserObject(),
toString()
public ObjectgetUserObject()
setUserObject(java.lang.Object),
toString()
public void removeFromParent()
public void remove(MutableTreeNodeaChild)
aChild from this node's child array, giving it a null parent.
remove in interface
MutableTreeNode
aChild - a child of this node to remove
IllegalArgumentException - if
aChild is null or is not a child of this node
public void removeAllChildren()
public void add(MutableTreeNodenewChild)
newChild from its parent and makes it a child of this node by adding it to the end of this node's child array.
newChild - node to add as a child of this node
IllegalArgumentException - if
newChild is null
IllegalStateException - if this node does not allow children
insert(javax.swing.tree.MutableTreeNode, int)
public boolean isNodeAncestor(TreeNodeanotherNode)
anotherNode is an ancestor of this node -- if it is this node, this node's parent, or an ancestor of this node's parent. (Note that a node is considered an ancestor of itself.) If
anotherNode is null, this method returns false. This operation is at worst O(h) where h is the distance from the root to this node.
anotherNode - node to test as an ancestor of this node
anotherNode
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode),
getSharedAncestor(javax.swing.tree.DefaultMutableTreeNode)
public boolean isNodeDescendant(DefaultMutableTreeNodeanotherNode)
anotherNode is a descendant of this node -- if it is this node, one of this node's children, or a descendant of one of this node's children. Note that a node is considered a descendant of itself. If
anotherNode is null, returns false. This operation is at worst O(h) where h is the distance from the root to
anotherNode.
anotherNode - node to test as descendant of this node
anotherNode
isNodeAncestor(javax.swing.tree.TreeNode),
getSharedAncestor(javax.swing.tree.DefaultMutableTreeNode)
public TreeNodegetSharedAncestor(DefaultMutableTreeNode aNode)
aNode. Returns null, if no such ancestor exists -- if this node and
aNode are in different trees or if
aNode is null. A node is considered an ancestor of itself.
aNode - node to find common ancestor with
aNode, or null if none
isNodeAncestor(javax.swing.tree.TreeNode),
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public boolean isNodeRelated(DefaultMutableTreeNodeaNode)
aNode is in the same tree as this node. Returns false if
aNode is null.
aNode is in the same tree as this node; false if
aNode is null
getSharedAncestor(javax.swing.tree.DefaultMutableTreeNode),
getRoot()
public int getDepth()
getLevel() because it must effectively traverse the entire tree rooted at this node.
getLevel()
public int getLevel()
getDepth()
public TreeNode[] getPath()
protected TreeNode[] getPathToRoot(TreeNode aNode, int depth)
aNode - the TreeNode to get the path for
depth - an int giving the number of steps already taken towards the root (on recursive calls), used to size the returned array
public Object[] getUserObjectPath()
public TreeNodegetRoot()
isNodeAncestor(javax.swing.tree.TreeNode)
public boolean isRoot()
public DefaultMutableTreeNodegetNextNode()
preorderEnumeration()
public DefaultMutableTreeNodegetPreviousNode()
null if this node is the first node of the traversal -- the root of the tree. This is an inefficient way to traverse the entire tree; use an enumeration, instead.
preorderEnumeration()
public EnumerationpreorderEnumeration()
nextElement() method is this node.
Modifying the tree by inserting, removing, or moving a node invalidates any enumerations created before the modification.
postorderEnumeration()
public EnumerationpostorderEnumeration()
nextElement() method is the leftmost leaf. This is the same as a depth-first traversal.
Modifying the tree by inserting, removing, or moving a node invalidates any enumerations created before the modification.
depthFirstEnumeration(),
preorderEnumeration()
public EnumerationbreadthFirstEnumeration()
nextElement() method is this node.
Modifying the tree by inserting, removing, or moving a node invalidates any enumerations created before the modification.
depthFirstEnumeration()
public EnumerationdepthFirstEnumeration()
nextElement() method is the leftmost leaf. This is the same as a postorder traversal.
Modifying the tree by inserting, removing, or moving a node invalidates any enumerations created before the modification.
breadthFirstEnumeration(),
postorderEnumeration()
public EnumerationpathFromAncestorEnumeration(TreeNode ancestor)
ancestor to this node. The enumeration's
nextElement() method first returns
ancestor, then the child of
ancestor that is an ancestor of this node, and so on, and finally returns this node. Creation of the enumeration is O(m) where m is the number of nodes between this node and
ancestor, inclusive. Each
nextElement() message is O(1).
Modifying the tree by inserting, removing, or moving a node invalidates any enumerations created before the modification.
IllegalArgumentException - if
ancestor is not an ancestor of this node
isNodeAncestor(javax.swing.tree.TreeNode),
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public boolean isNodeChild(TreeNodeaNode)
aNode is a child of this node. If
aNode is null, this method returns false.
aNode is a child of this node; false if
aNode is null
public TreeNodegetFirstChild()
NoSuchElementException - if this node has no children
public TreeNodegetLastChild()
NoSuchElementException - if this node has no children
public TreeNodegetChildAfter(TreeNode aChild)
aChild, which must be a child of this node. If
aChild is the last child, returns null. This method performs a linear search of this node's children for
aChild and is O(n) where n is the number of children; to traverse the entire array of children, use an enumeration instead.
aChild
IllegalArgumentException - if
aChild is null or is not a child of this node
children
public TreeNodegetChildBefore(TreeNode aChild)
aChild, which must be a child of this node. If
aChild is the first child, returns null. This method performs a linear search of this node's children for
aChild and is O(n) where n is the number of children.
aChild
IllegalArgumentException - if
aChild is null or is not a child of this node
public boolean isNodeSibling(TreeNodeanotherNode)
anotherNode is a sibling of (has the same parent as) this node. A node is its own sibling. If
anotherNode is null, returns false.
anotherNode - node to test as sibling of this node
anotherNode is a sibling of this node
public int getSiblingCount()
1).
public DefaultMutableTreeNodegetNextSibling()
children
public DefaultMutableTreeNodegetPreviousSibling()
public boolean isLeaf()
getAllowsChildren
isLeaf in interface
TreeNode
getAllowsChildren()
public DefaultMutableTreeNodegetFirstLeaf()
isLeaf(),
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public DefaultMutableTreeNodegetLastLeaf()
isLeaf(),
isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
public DefaultMutableTreeNodegetNextLeaf()
In this implementation of the MutableNode interface, this operation is very inefficient. In order to determine the next node, this method first performs a linear search in the parent's child-list in order to find the current node.
That implementation makes the operation suitable for short traversals from a known position. But to traverse all of the leaves in the tree, you should use depthFirstEnumeration to enumerate the nodes in the tree and use isLeaf on each node to determine which are leaves.
depthFirstEnumeration(),
isLeaf()
public DefaultMutableTreeNodegetPreviousLeaf()
In this implementation of the MutableNode interface, this operation is very inefficient. In order to determine the previous node, this method first performs a linear search in the parent's child-list in order to find the current node.
That implementation makes the operation suitable for short traversals from a known position. But to traverse all of the leaves in the tree, you should use depthFirstEnumeration to enumerate the nodes in the tree and use isLeaf on each node to determine which are leaves.
depthFirstEnumeration(),
isLeaf()
public int getLeafCount()
1. This method is O(n) where n is the number of descendants of this node.
isNodeAncestor(javax.swing.tree.TreeNode)
public StringtoString()
toString() to this node's user object, or the empty string if the node has no user object.
toString in class
Object
getUserObject()