Module  java.desktop
软件包  javax.swing.tree

Class DefaultMutableTreeNode

  • All Implemented Interfaces:
    SerializableCloneableMutableTreeNodeTreeNode
    已知直接子类:
    JTree.DynamicUtilTreeNode


    public class DefaultMutableTreeNode
    extends Object
    implements Cloneable, MutableTreeNode, Serializable
    A 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

    另请参见:
    MutableTreeNodeSerialized Form
    • 字段详细信息

      • EMPTY_ENUMERATION

        public static final Enumeration<TreeNode> EMPTY_ENUMERATION
        一个总是空的枚举。 当请求枚举一个叶节点的子节点时使用此选项。
      • parent

        protected MutableTreeNode parent
        该节点的父节点,如果此节点没有父节点,则为null
      • children

        protected Vector<TreeNode> children
        如果此节点没有子节点,则可能为null
      • userObject

        protected transient Object userObject
        可选的用户对象
      • allowsChildren

        protected boolean allowsChildren
        如果节点能够拥有子节点,则为true
    • 构造方法详细信息

      • DefaultMutableTreeNode

        public DefaultMutableTreeNode​()
        创建一个树节点,没有父节点,没有子节点,但它允许子节点。
      • DefaultMutableTreeNode

        public DefaultMutableTreeNode​(Object userObject)
        创建一个没有父进程,没有子节点,但允许子节点的树节点,并用指定的用户对象初始化它。
        参数
        userObject - 由用户提供的构成节点数据的对象
      • DefaultMutableTreeNode

        public DefaultMutableTreeNode​(Object userObject,
                                      boolean allowsChildren)
        创建一个没有父进程的树节点,没有子节点,用指定的用户对象进行初始化,只有在指定的时候才允许子节点。
        参数
        userObject - 由用户提供的构成节点数据的对象
        allowsChildren - 如果为true,则允许该节点具有子节点 - 否则它总是一个叶节点
    • 方法详细信息

      • remove

        public void remove​(int childIndex)
        从该节点的子节点删除指定索引处的子节点,并将该节点的父节点设置为null。 要删除的子节点必须是MutableTreeNode
        Specified by:
        remove在接口 MutableTreeNode
        参数
        childIndex - 要删除的子节点的此节点的子数组中的索引
        异常
        ArrayIndexOutOfBoundsException - 如果 childIndex超出范围
      • setParent

        public void setParent​(MutableTreeNode newParent)
        将此节点的父节点设置为newParent但不会更改父节点的子数组。 该方法从insert()remove()调用,以重新分配一个孩子的父代,它不应该从其他地方消息。
        Specified by:
        setParent在接口 MutableTreeNode
        参数
        newParent - 这个节点的新父
      • getParent

        public TreeNode getParent​()
        返回此节点的父节点,如果此节点没有父节点,则返回null。
        Specified by:
        getParent在接口 TreeNode
        结果
        此节点的父TreeNode,如果此节点没有父节点,则为null
      • getChildAt

        public TreeNode getChildAt​(int index)
        返回此节点的子数组中指定索引处的子节点。
        Specified by:
        getChildAt在接口 TreeNode
        参数
        index - 此节点的子数组的索引
        结果
        该节点的TreeNode在指定索引的子数组中
        异常
        ArrayIndexOutOfBoundsException - 如果 index超出范围
      • getChildCount

        public int getChildCount​()
        返回此节点的子节点数。
        Specified by:
        getChildCount在接口 TreeNode
        结果
        一个int给出这个节点的子节点数
      • getIndex

        public int getIndex​(TreeNode aChild)
        返回此节点的子数组中指定子节点的索引。 如果指定的节点不是此节点的子节点,则返回-1 该方法执行线性搜索,并且是O(n),其中n是子数。
        Specified by:
        getIndex在接口 TreeNode
        参数
        aChild - 在该节点的子节点之间搜索的TreeNode
        结果
        一个int给出该节点子节点中节点的索引,如果指定的节点不是此节点的子节点, -1
        异常
        IllegalArgumentException - 如果 aChild为空
      • children

        public Enumeration<TreeNode> children​()
        创建并返回该节点的子节点的前向枚举。 修改此节点的子数组会使修改之前创建的所有子枚举失效。
        Specified by:
        children在接口 TreeNode
        结果
        这个节点的孩子的枚举
      • setAllowsChildren

        public void setAllowsChildren​(boolean allows)
        确定此节点是否允许有子节点。 如果allows为false,则删除该节点的所有子节点。

        注意:默认情况下,一个节点允许孩子。

        参数
        allows - 如果此节点允许有子节点,则为true
      • getAllowsChildren

        public boolean getAllowsChildren​()
        如果该节点允许有子节点,则返回true。
        Specified by:
        getAllowsChildren在接口 TreeNode
        结果
        如果此节点允许孩子,则为true,否则为false
      • removeFromParent

        public void removeFromParent​()
        从树中除去根节点的子树,给这个节点一个空父。 如果此节点是其树的根,则不执行任何操作。
        Specified by:
        removeFromParent在接口 MutableTreeNode
      • remove

        public void remove​(MutableTreeNode aChild)
        从此节点的子数组中删除 aChild ,给它一个空父项。
        Specified by:
        remove在接口 MutableTreeNode
        参数
        aChild - 此节点的子节点要删除
        异常
        IllegalArgumentException - 如果 aChild为空或不是此节点的子节点
      • removeAllChildren

        public void removeAllChildren​()
        删除所有这个节点的孩子,将他们的父母设置为null。 如果此节点没有子节点,此方法不执行任何操作。
      • isNodeAncestor

        public boolean isNodeAncestor​(TreeNode anotherNode)
        如果anotherNode是此节点的祖先 - 如果是此节点,此节点的父节点或此节点的父节点的祖先,则返回true。 (请注意,节点被认为是自身的祖先。)如果anotherNode为空,则此方法返回false。 此操作处于最差O(h),其中h是从根到该节点的距离。
        参数
        anotherNode - 要作为此节点的祖先进行测试的节点
        结果
        如果此节点是 anotherNode的后代, anotherNode
        另请参见:
        isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)getSharedAncestor(javax.swing.tree.DefaultMutableTreeNode)
      • isNodeDescendant

        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)
      • getDepth

        public int getDepth​()
        返回根据此节点的树的深度 - 从该节点到叶片的最长距离。 如果此节点没有子节点,则返回0.此操作比getLevel()要贵得多,因为它必须有效地遍历以该节点为根的整个树。
        结果
        树根的深度是这个节点
        另请参见:
        getLevel()
      • getLevel

        public int getLevel​()
        返回此节点以上的级别数 - 从根到该节点的距离。 如果此节点是根节点,则返回0。
        结果
        该节点上方的级别数
        另请参见:
        getDepth()
      • getPath

        public TreeNode[] getPath​()
        从根返回路径,以获取到此节点。 路径中的最后一个元素是此节点。
        结果
        提供路径的TreeNode对象数组,路径中的第一个元素是根,最后一个元素是该节点。
      • getPathToRoot

        protected TreeNode[] getPathToRoot​(TreeNode aNode,
                                           int depth)
        构建节点直到并包括根节点的父节点,其中原始节点是返回的数组中的最后一个元素。 返回的数组的长度给出了节点在树中的深度。
        参数
        aNode - 获取路径的TreeNode
        depth - 一个int给出已经为根(在递归调用)上已经采取的步骤数,用于对返回的数组进行大小
        结果
        一个TreeNodes数组,提供从根到指定节点的路径
      • getUserObjectPath

        public Object[] getUserObjectPath​()
        从根中返回用户对象路径,以获取到此节点。 如果路径中的某些TreeNodes具有空用户对象,则返回的路径将包含null。
        结果
        用户对象路径,从根,到达这个节点
      • isRoot

        public boolean isRoot​()
        如果此节点是树的根,则返回true。 根是树中唯一一个空父的节点; 每棵树只有一根根。
        结果
        如果此节点是其树的根,则为true
      • getNextNode

        public DefaultMutableTreeNode getNextNode​()
        在此节点的树的预序遍历中返回此节点后面的节点。 如果此节点是遍历的最后一个节点,则返回null。 这是遍历整个树的低效方法; 使用枚举,而不是。
        结果
        在预订遍历中跟随此节点的节点,如果此节点为最后,则为null
        另请参见:
        preorderEnumeration()
      • getPreviousNode

        public DefaultMutableTreeNode getPreviousNode​()
        在此节点的树的预序遍历中返回此节点之前的节点。 如果此节点是遍历的第一个节点 - 树的根,则返回null 这是遍历整个树的低效方法; 使用枚举,而不是。
        结果
        预先遍历此节点之前的节点,如果此节点是第一个节点,则返回null
        另请参见:
        preorderEnumeration()
      • preorderEnumeration

        public Enumeration<TreeNode> preorderEnumeration​()
        创建并返回以预订方式遍历此节点的子树的枚举。 由枚举的nextElement()方法返回的第一个节点是此节点。

        通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举失效。

        结果
        在预订中遍历树的枚举
        另请参见:
        postorderEnumeration()
      • postorderEnumeration

        public Enumeration<TreeNode> postorderEnumeration​()
        创建并返回在postorder中遍历此节点的子树的枚举。 枚举的nextElement()方法返回的第一个节点是最左边的叶。 这与深度优先遍历相同。

        通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举失效。

        结果
        在后期遍历树的枚举
        另请参见:
        depthFirstEnumeration()preorderEnumeration()
      • breadthFirstEnumeration

        public Enumeration<TreeNode> breadthFirstEnumeration​()
        创建并返回以宽度优先顺序遍历以此节点为根的子树的枚举。 这个节点是枚举nextElement()方法返回的第一个节点。

        通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举失效。

        结果
        以宽度优先顺序遍历树的枚举
        另请参见:
        depthFirstEnumeration()
      • depthFirstEnumeration

        public Enumeration<TreeNode> depthFirstEnumeration​()
        创建并返回以深度优先顺序遍历以此节点为根的子树的枚举。 枚举的nextElement()方法返回的第一个节点是最左边的叶。 这与后期遍历相同。

        通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举失效。

        结果
        一个以深度顺序遍历树的枚举
        另请参见:
        breadthFirstEnumeration()postorderEnumeration()
      • pathFromAncestorEnumeration

        public Enumeration<TreeNode> pathFromAncestorEnumeration​(TreeNode ancestor)
        创建并返回从ancestor到此节点的路径ancestor的枚举。 枚举的nextElement()方法首先返回ancestor ,然后是该节点的祖先的ancestor的子节点,等等,最后返回此节点。 枚举的创建是O(m)其中m是此节点与ancestor之间的节ancestor (包括端点)。 每条nextElement()消息都是O(1)。

        通过插入,删除或移动节点来修改树,会使修改前创建的任何枚举失效。

        参数
        ancestor - 从中开始枚举的节点
        结果
        跟踪从这个节点的祖先到这个节点的路径的枚举
        异常
        IllegalArgumentException - 如果 ancestor不是此节点的祖先
        另请参见:
        isNodeAncestor(javax.swing.tree.TreeNode)isNodeDescendant(javax.swing.tree.DefaultMutableTreeNode)
      • isNodeChild

        public boolean isNodeChild​(TreeNode aNode)
        如果aNode是此节点的子节点,则返回true。 如果aNode为null,则此方法返回false。
        参数
        aNode - 确定它是否是一个小孩的节点
        结果
        如果aNode是此节点的子节点, aNode true; 如果aNode为空,则为false
      • getFirstChild

        public TreeNode getFirstChild​()
        返回此节点的第一个子节点。 如果此节点没有子节点,则抛出NoSuchElementException。
        结果
        这个节点的第一个孩子
        异常
        NoSuchElementException - 如果此节点没有子节点
      • getLastChild

        public TreeNode getLastChild​()
        返回此节点的最后一个子节点。 如果此节点没有子节点,则抛出NoSuchElementException。
        结果
        这个节点的最后一个小孩
        异常
        NoSuchElementException - 如果此节点没有子节点
      • getChildAfter

        public TreeNode getChildAfter​(TreeNode aChild)
        返回该节点的子阵列中紧跟着aChild的子节点,它必须是此节点的子节点。 如果最后一个小孩为aChild ,则返回null。 该方法对该节点的子节点进行线性搜索,为aChild ,为O(n),其中n为子节点数; 遍历整个子系列,改用枚举。
        参数
        aChild - 子节点查找下一个小孩后
        结果
        这个节点的小孩紧随其后的是 aChild
        异常
        IllegalArgumentException - 如果 aChild为空或不是此节点的子节点
        另请参见:
        children
      • getChildBefore

        public TreeNode getChildBefore​(TreeNode aChild)
        返回该节点的子阵列中紧靠在aChild之前的子节点,它必须是此节点的子节点。 如果aChild是第一个孩子,则返回null。 该方法对该节点的子节点进行线性搜索,为aChild ,为O(n),其中n为子节点数。
        参数
        aChild - 子节点在之前查找之前的孩子
        结果
        该节点的子节点紧接在 aChild之前
        异常
        IllegalArgumentException - 如果 aChild为空或不是此节点的子节点
      • isNodeSibling

        public boolean isNodeSibling​(TreeNode anotherNode)
        如果anotherNode是与此节点(具有相同的父节点)的兄弟anotherNode则返回true。 一个节点是自己的兄弟姐妹。 如果anotherNode为null,则返回false。
        参数
        anotherNode - 要测试此节点的节点的节点
        结果
        如果 anotherNode是此节点的兄弟节点, anotherNode true
      • getSiblingCount

        public int getSiblingCount​()
        返回此节点的兄弟节点数。 节点是自己的兄弟(如果没有父节点或没有兄弟节点,此方法返回1 )。
        结果
        该节点的兄弟姐妹数量
      • getNextSibling

        public DefaultMutableTreeNode getNextSibling​()
        返回父节点的子节点数组中该节点的下一个兄弟节点。 如果此节点没有父节点或父节点的最后一个子节点,则返回null。 该方法执行O(n)的线性搜索,其中n是子数; 要遍历整个数组,请改用父级的子枚举。
        结果
        这个节点的兄弟姐妹紧跟这个节点
        另请参见:
        children
      • getPreviousSibling

        public DefaultMutableTreeNode getPreviousSibling​()
        返回父节点的子节点中此节点的前一个同级节点。 如果此节点没有父节点或父节点的第一个子节点,则返回null。 该方法执行O(n)的线性搜索,其中n是子数。
        结果
        该节点的兄弟姐妹紧邻该节点之前
      • isLeaf

        public boolean isLeaf​()
        如果此节点没有子节点,则返回true。 要区分没有子节点和节点不能有子节点(例如,区分文件和空目录),请使用此方法与getAllowsChildren
        Specified by:
        isLeaf在接口 TreeNode
        结果
        如果此节点没有子节点,则为true
        另请参见:
        getAllowsChildren()
      • getNextLeaf

        public DefaultMutableTreeNode getNextLeaf​()
        返回此节点之后的叶,如果此节点是树中的最后一个叶,则返回null。

        在这个MutableNode接口的实现中,这个操作是非常低效的。 为了确定下一个节点,该方法首先在父子列表中执行线性搜索,以便查找当前节点。

        该实现使得操作适合于从已知位置的短遍历。 但要遍历树中的所有树叶,您应该使用depthFirstEnumeration枚举树中的节点,并在每个节点上使用isLeaf来确定哪些是叶。

        结果
        返回通过此节点的下一个叶
        另请参见:
        depthFirstEnumeration()isLeaf()
      • getPreviousLeaf

        public DefaultMutableTreeNode getPreviousLeaf​()
        返回此节点之前的叶子,如果此节点是树中的第一个叶子,则返回null。

        在这个MutableNode接口的实现中,这个操作是非常低效的。 为了确定先前的节点,该方法首先在父子列表中执行线性搜索,以便查找当前节点。

        该实现使得操作适合于从已知位置的短遍历。 但是要遍历树中的所有叶,应该使用depthFirstEnumeration枚举树中的节点,并在每个节点上使用isLeaf来确定哪些是叶。

        结果
        在该节点之前返回叶
        另请参见:
        depthFirstEnumeration()isLeaf()
      • getLeafCount

        public int getLeafCount​()
        返回作为该节点后代的树叶总数。 如果此节点为叶,则返回1 该方法是O(n),其中n是该节点的后代数。
        结果
        这个节点下的叶数
        另请参见:
        isNodeAncestor(javax.swing.tree.TreeNode)
      • toString

        public String toString​()
        返回向该节点的用户对象发送 toString()的结果,如果节点没有用户对象,则返回空字符串。
        重写:
        toStringObject
        结果
        对象的字符串表示形式。
        另请参见:
        getUserObject()
      • clone

        public Object clone​()
        覆盖使克隆公开。 返回此节点的浅拷贝; 新节点没有父或子节点,并且具有对同一个用户对象(如果有的话)的引用。
        重写:
        cloneObject
        结果
        这个节点的副本
        另请参见:
        Cloneable