Module  javafx.controls
软件包  javafx.scene.control

Class TreeItem<T>

  • 参数类型
    T - TreeItem中的 value属性的类型。
    All Implemented Interfaces:
    EventTarget
    已知直接子类:
    CheckBoxTreeItem


    public class TreeItem<T>
    extends Object
    implements EventTarget
    单个节点的模型为诸如TreeView之类的控件提供值的层次结构。 可以实现该模型,使得值可以根据需要加载到存储器中。

    该模型允许注册听众,将被通知为项目变更的数量,他们的位置或值本身如何变化。 但是请注意,TreeItem 不是 Node,因此TreeItem上不会触发视觉事件。 为了获得这些事件,有必要将相关观察者添加到TreeCell实例(通过自定义单元格工厂 - 有关详细信息,请参阅Cell类文档)。

    在最简单的情况下,可以在内存中创建TreeItem实例:

       TreeItem<String> root = new TreeItem<String>("Root Node"); root.setExpanded(true); root.getChildren().addAll( new TreeItem<String>("Item 1"), new TreeItem<String>("Item 2"), new TreeItem<String>("Item 3") ); TreeView<String> treeView = new TreeView<String>(root);  
    这种方法适用于简单的树结构,或者数据不是过多的(这样可以很容易地适应内存)。 在树结构大小未知(因此潜在巨大)的情况下,可以以高效的内存方式按需创建TreeItem实例。 为了演示这个,下面的代码创建一个文件系统浏览器:
       private TreeView buildFileSystemBrowser() { TreeItem<File> root = createNode(new File("/")); return new TreeView<File>(root); } // This method creates a TreeItem to represent the given File. It does this // by overriding the TreeItem.getChildren() and TreeItem.isLeaf() methods // anonymously, but this could be better abstracted by creating a // 'FileTreeItem' subclass of TreeItem. However, this is left as an exercise // for the reader. private TreeItem<File> createNode(final File f) { return new TreeItem<File>(f) { // We cache whether the File is a leaf or not. A File is a leaf if // it is not a directory and does not have any files contained within // it. We cache this as isLeaf() is called often, and doing the // actual check on File is expensive. private boolean isLeaf; // We do the children and leaf testing only once, and then set these // booleans to false so that we do not check again during this // run. A more complete implementation may need to handle more // dynamic file system situations (such as where a folder has files // added after the TreeView is shown). Again, this is left as an // exercise for the reader. private boolean isFirstTimeChildren = true; private boolean isFirstTimeLeaf = true; @Override public ObservableList<TreeItem<File>> getChildren() { if (isFirstTimeChildren) { isFirstTimeChildren = false; // First getChildren() call, so we actually go off and // determine the children of the File contained in this TreeItem. super.getChildren().setAll(buildChildren(this)); } return super.getChildren(); } @Override public boolean isLeaf() { if (isFirstTimeLeaf) { isFirstTimeLeaf = false; File f = (File) getValue(); isLeaf = f.isFile(); } return isLeaf; } private ObservableList<TreeItem<File>> buildChildren(TreeItem<File> TreeItem) { File f = TreeItem.getValue(); if (f != null && f.isDirectory()) { File[] files = f.listFiles(); if (files != null) { ObservableList<TreeItem<File>> children = FXCollections.observableArrayList(); for (File childFile : files) { children.add(createNode(childFile)); } return children; } } return FXCollections.emptyObservableList(); } }; } 
    TreeItem事件

    TreeItem支持与场景图中其他地方相同的事件冒泡概念。 这意味着没有必要在所有TreeItems上收听事件(这当然不鼓励!)。 更好的和更低成本的解决方案是将事件监听器附加到TreeView root项目。 只要在事件发生的地方和根TreeItem之间存在路径,事件将被冒泡到根项目。

    但是请注意,TreeItem 不是一个Node,这意味着只有在TreeItem中定义的事件类型才能被传递。 要收听一般事件(例如鼠标交互),需要在TreeView中包含的cells (通过提供cell factory )添加必要的侦听器。

    TreeItem类定义了一些具有定义层次结构的事件。 这些显示如下(按照链接了解有关每个事件类型的更多信息):

    上面所示的缩进表示事件类型之间的关系。 例如,所有TreeItem事件类型有treeNotificationEvent()其父事件类型,分支expand / 二七○七○二一五○二五七三八一事件类型均为treeNotificationEvent() 出于性能原因,鼓励您只听取您需要听的事件。 这意味着鼓励最好听,例如TreeItem.valueChangedEvent() ,而不是TreeItem.treeNotificationEvent()

    从以下版本开始:
    JavaFX 2.0
    • 构造方法详细信息

      • TreeItem

        public TreeItem​()
        创建一个空TreeItem。
      • TreeItem

        public TreeItem​(T value)
        创建一个TreeItem,其value属性设置为提供的对象。
        参数
        value - 要存储的对象作为此TreeItem的值。
      • TreeItem

        public TreeItem​(T value,
                        Node graphic)
        创建一个TreeItem,其value属性设置为提供的对象,图形设置为提供的节点。
        参数
        value - 要存储的对象作为此TreeItem的值。
        graphic - 要在TreeView旁边显示的节点。
    • 方法详细信息

      • treeNotificationEvent

        public static <T> EventType<TreeItem.TreeModificationEvent<T>> treeNotificationEvent​()
        用于指示事件在TreeItem中发生的基本EventType。 当TreeItem中发生事件时,事件发生之前,事件将触发TreeItem上的任何侦听器,然后通过跟随TreeItem父属性来启动TreeItem链。 这将重复,直到达到父TreeItem为null的TreeItem此时,事件将停止“冒泡”,不再进一步。 这意味着在TreeItem上发生的事件可以相对便宜,因为监听器只需要安装在TreeView根节点上,以便在树中的任何一点发生事件。
        参数类型
        T - TreeItem中包含的值的类型。
        结果
        TreeItem中发生事件时的基本EventType
      • branchExpandedEvent

        public static <T> EventType<TreeItem.TreeModificationEvent<T>> branchExpandedEvent​()
        当TreeItem接收到其扩展属性的修改时使用的EventType,使得TreeItem现在处于展开状态。
        参数类型
        T - TreeItem中包含的值的类型。
        结果
        TreeItem接收到修改时使用的EventType
      • branchCollapsedEvent

        public static <T> EventType<TreeItem.TreeModificationEvent<T>> branchCollapsedEvent​()
        当TreeItem接收到其扩展属性的修改时使用的EventType,使得TreeItem现在处于折叠状态。
        参数类型
        T - TreeItem中包含的值的类型。
        结果
        TreeItem接收修改时的EventType
      • childrenModificationEvent

        public static <T> EventType<TreeItem.TreeModificationEvent<T>> childrenModificationEvent​()
        当TreeItem接收到对其子列表的直接修改时使用的EventType。
        参数类型
        T - TreeItem中包含的值的类型。
        结果
        TreeItem接收对其子列表的直接修改时的EventType
      • valueChangedEvent

        public static <T> EventType<TreeItem.TreeModificationEvent<T>> valueChangedEvent​()
        当TreeItem接收到对其value属性的修改时使用的EventType。
        参数类型
        T - TreeItem中包含的值的类型。
        结果
        TreeItem接收到其value属性的修改时的EventType
      • graphicChangedEvent

        public static <T> EventType<TreeItem.TreeModificationEvent<T>> graphicChangedEvent​()
        当TreeItem接收到其图形属性的修改时使用的EventType。
        参数类型
        T - TreeItem中包含的值的类型。
        结果
        TreeItem接收到其图形属性的修改时的EventType
      • setValue

        public final void setValue​(T value)
        设置此TreeItem表示的应用程序特定数据。
        参数
        value - 应用程序特定的数据
      • getValue

        public final T getValue​()
        返回此TreeItem表示的特定于应用程序的数据。
        结果
        该TreeItem表示的数据
      • valueProperty

        public final ObjectProperty<T> valueProperty​()
        表示此TreeItem中包含的特定于应用程序的数据的属性。
        结果
        表示此TreeItem中包含的特定于应用程序的数据的属性
      • setGraphic

        public final void setGraphic​(Node value)
        设置通常显示在value属性左侧的节点。 为了获得最佳效果,这往往是一个16x16的图像。
        参数
        value - 将显示给用户的图形节点。
      • getGraphic

        public final Node getGraphic​()
        返回通常显示在value属性左侧的节点。 为了获得最佳效果,这往往是一个16x16的图像。
        结果
        将显示给用户的图形节点。
      • graphicProperty

        public final ObjectProperty<Node> graphicProperty​()
        通常显示在value属性左侧的节点。 为了获得最佳效果,这往往是一个16x16的图像。
        另请参见:
        getGraphic()setGraphic(Node)
      • setExpanded

        public final void setExpanded​(boolean value)
        设置此TreeItem的展开状态。 这对没有孩子的TreeItem没有影响。 在有孩子的TreeItem上,切换该属性的结果是,视觉上孩子将会变得可见或隐藏,基于是否将扩展设置为true或false。
        参数
        value - 如果此TreeItem有子项,则使用true调用true将导致孩子变得可见。 使用false调用setExpanded将隐藏属于TreeItem的任何子项。
      • isExpanded

        public final boolean isExpanded​()
        返回此TreeItem的展开状态。
        结果
        返回此TreeItem的展开状态。
      • isLeaf

        public boolean isLeaf​()
        TreeItem是一个叶子,如果它没有孩子。 当然,可以通过子类覆盖isLeaf方法来支持定义TreeItem可能是一个叶子的替代方法,但是一般的前提是相同的:叶子不能被用户扩展,因此不会显示一个披露节点或响应扩展请求。
        结果
        如果此TreeItem没有子项,则为true
      • leafProperty

        public final ReadOnlyBooleanProperty leafProperty​()
        表示TreeItem leaf属性,如果TreeItem没有子节点,则属性为true。
        另请参见:
        isLeaf()
      • getParent

        public final TreeItem<T> getParent​()
        这个TreeItem的父项。 每个TreeItem可以只有一个以上的父项。 如果TreeItem没有父项,它表示树模型中的根。
        结果
        此TreeItem的父项,如果TreeItem没有父项,则为null。
      • getChildren

        public ObservableList<TreeItem<T>> getChildren​()
        这个TreeItem的孩子。 这种方法被频繁地调用,因此推荐返回的列表被任何TreeItem实现缓存。
        结果
        包含属于TreeItem的子TreeItems的列表。
      • previousSibling

        public TreeItem<T> previousSibling​()
        返回TreeItem的以前的同级。 订购是基于TreeItem相对于属于TreeItem父项的子列表中的兄弟姐妹的位置。
        结果
        一个TreeItem,它是当前TreeItem的前一个兄弟节点,如果没有找到这样的兄弟节点,则返回null。
      • previousSibling

        public TreeItem<T> previousSibling​(TreeItem<T> beforeNode)
        返回给定节点之前的同级。 订购是基于给定TreeItem相对于属于TreeItem父项的子列表中的兄弟姐妹的位置。
        参数
        beforeNode - 正在寻找以前的兄弟姐妹的TreeItem。
        结果
        一个TreeItem,它是给定TreeItem的前一个同级,如果没有找到这样的兄弟,则为null。
      • nextSibling

        public TreeItem<T> nextSibling​()
        返回TreeItem的下一个兄弟节点。 订购是基于TreeItem相对于属于TreeItem父项的子列表中的兄弟姐妹的位置。
        结果
        一个TreeItem,它是当前TreeItem的下一个兄弟节点,如果没有找到这样的兄弟节点,则为null。
      • nextSibling

        public TreeItem<T> nextSibling​(TreeItem<T> afterNode)
        返回给定节点之后的下一个兄弟节点。 订购是基于给定TreeItem相对于属于TreeItem父项的子列表中的兄弟姐妹的位置。
        参数
        afterNode - 正在寻找下一个兄弟姐妹的TreeItem。
        结果
        作为给定TreeItem的下一个同级的TreeItem,如果没有找到这样的兄弟,则为null。
      • toString

        public String toString​()
        返回此 TreeItem对象的字符串表示形式。
        重写:
        toStringObject
        结果
        这个 TreeItem对象的字符串表示形式。
      • buildEventDispatchChain

        public EventDispatchChain buildEventDispatchChain​(EventDispatchChain tail)
        为此目标构建事件调度链。 事件调度链包含可能对处理针对EventTarget的事件感兴趣的事件调度EventTarget 此事件目标不会自动添加到链中,因此如果要处理事件,则需要为链接添加一个EventDispatcher

        在事件目标是某些层次结构的一部分的情况下,它的链通常是从从层次结构的根被收集到事件目标的事件分派器构建的。

        事件调度链是通过修改提供的初始事件调度链来构建的。 返回的链应该在其末端具有初始链,所以调度员应该放在初始链上。

        调用者不应该假定初始链条保持不变,也不会返回值引用不同的链。

        Specified by:
        buildEventDispatchChain在接口 EventTarget
        参数
        tail - 建立起来的初始链
        结果
        此目标的结果事件调度链
      • addEventHandler

        public <E extends Event> void addEventHandler​(EventType<E> eventType,
                                                      EventHandler<E> eventHandler)
        将一个事件处理程序注册到此TreeItem。 TreeItem类允许监听器的注册,将被通知为项目更改的数量,它们的位置或值本身是如何变化的。 但是请注意,TreeItem 不是 Node,因此TreeItem上不会触发视觉事件。 要获得这些事件,有必要将相关观察者添加到TreeCell实例(通过一个自定义单元格工厂 - 有关详细信息,请参阅Cell类文档)。
        参数类型
        E - 事件
        参数
        eventType - 由处理程序接收的事件的类型
        eventHandler - 要注册的处理程序
        异常
        NullPointerException - 如果事件类型或处理程序为空
      • removeEventHandler

        public <E extends Event> void removeEventHandler​(EventType<E> eventType,
                                                         EventHandler<E> eventHandler)
        从此TreeItem中注销先前注册的事件处理程序。 一个处理程序可能已被注册用于不同的事件类型,因此调用者需要指定特定的事件类型,从中注销处理程序。
        参数类型
        E - 事件
        参数
        eventType - 要注销的事件类型
        eventHandler - 要注销的处理程序
        异常
        NullPointerException - 如果事件类型或处理程序为空