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

Class TreeView<T>

  • 参数类型
    T - 此TreeView中所有树项目的TreeItem值属性中包含的项目的类型。
    All Implemented Interfaces:
    StyleableEventTargetSkinnable


    @DefaultProperty("root")
    public class TreeView<T>
    extends Control
    TreeView控件提供了一个到根的视图( TreeItem型)。 通过使用TreeView,可以递归地向下钻取TreeItem的子对象,直到TreeItem没有子节点(即树中的节点)。 为了推动这项工作,不像在控制ListView ,在TreeView中有必要指定root节点。

    有关使用此方法构建树的更多信息,请参阅TreeItem类文档。 但是简单地说,要创建一个TreeView,你应该按照以下几点做一些事情:

       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);  

    一个TreeView可以被配置为可选地由设置隐藏根节点showRoot属性false 如果根节点被隐藏,则减少一个级别的缩进,并显示根节点的所有子节点。 默认情况下,根节点显示在TreeView中。

    TreeView Selection / Focus API

    要跟踪选择和重点,有必要熟悉SelectionModelFocusModel课程。 TreeView最多只有一个这些类的一个实例,分别可从selectionModelfocusModel属性获得。 虽然可以使用此API来设置新的选择模型,但在大多数情况下,这不是必需的 - 默认选择和焦点模型应该在大多数情况下工作。

    在实例化TreeView时使用的默认值为SelectionModelMultipleSelectionModel抽象类的实现。 但是,如selectionMode属性的API文档中所述,默认值为SelectionMode.SINGLE 要在默认的TreeView实例中启用多个选择,因此需要执行以下操作:

       treeView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

    自定义TreeView视觉

    TreeView的视觉效果可以通过替换默认的cell factory完全自定义。 一个单元格工厂用于生成TreeCell实例,用于表示TreeView中的一个项目。 有关如何编写自定义单元格的更完整的说明,请参阅Cell类文档。

    编辑

    此控件支持值的内联编辑,本节尝试概述可用的API以及如何使用它们。

    首先,细胞编辑通常需要不同于不编辑细胞的用户界面。 这是正在使用的Cell实现的责任。 对于TreeView,这是cell factory的责任。 您可以选择单元格是否永久处于编辑状态(例如,这对于CheckBox单元格来说是常见的),或者在编辑开始时切换到不同的UI(例如,当单元格上接收到双击时)。

    要知道在单元格上请求编辑时,只需覆盖Cell.startEdit()方法,并根据需要更新单元格textgraphic属性(例如,将文本设置为空,并将图形设置为TextField )。 此外,您还应该覆盖Cell.cancelEdit()以便在编辑结束时将UI重置为原始的可视状态。 在这两种情况下,重要的是您还要确保您调用超级方法以使单元格执行所有必须执行的任务,以进入或退出其编辑模式。

    一旦您的单元格处于编辑状态,您最感兴趣的下一件事就是如何提交或取消正在进行的编辑。 这是您作为电池厂商的责任。 您的单元实现将基于用户输入(例如当用户按下键盘上的Enter键或ESC键时)知道编辑结束。 发生这种情况时,您有责任酌情致电Cell.commitEdit(Object)Cell.cancelEdit()

    当您调用Cell.commitEdit(Object)事件触发到TreeView,您可以通过setOnEditCommit(javafx.event.EventHandler)添加一个EventHandler观察 同样,您也可以观察edit startedit cancel编辑事件。

    默认情况下,TreeView编辑提交处理程序是非空的,默认处理程序会尝试覆盖当前正在编辑的行中的项目的属性值。 它可以做到这一点,因为Cell.commitEdit(Object)方法传递给新的值,并且这被传递给编辑提交处理程序通过TreeView.EditEvent被触发。 只需调用TreeView.EditEvent.getNewValue()即可检索该值。

    需要注意的是,如果你把它是非常重要的setOnEditCommit(javafx.event.EventHandler)用自己EventHandler ,那么你会删除默认的处理程序。 除非您再处理该属性(或相关数据源)的回写,否则不会发生任何事情。 您可以通过使用Node.addEventHandler(javafx.event.EventType, javafx.event.EventHandler)方法添加一个EDIT_COMMIT_EVENT EventType与您所需的EventHandler作为第二个参数。 使用此方法,您将不会替换默认实现,但在发生编辑提交时会收到通知。

    希望这个总结回答了一些常见问题。 幸运的是,JavaFX附带了许多预先构建的单元格工厂,可以代表您处理所有的编辑要求。 您可以在javafx.scene.control.cell包中找到这些预构建的单元工厂。

    从以下版本开始:
    JavaFX 2.0
    另请参见:
    TreeItemTreeCell
    • 构造方法详细信息

      • TreeView

        public TreeView​()
        创建一个空TreeView。

        有关其他属性的默认状态的详细信息,请参阅TreeView类文档。

      • TreeView

        public TreeView​(TreeItem<T> root)
        使用提供的根节点创建TreeView。

        有关其他属性的默认状态的详细信息,请参阅TreeView类文档。

        参数
        root - 该节点作为此TreeView中的根。
    • 方法详细信息

      • editStartEvent

        public static <T> EventType<TreeView.EditEvent<T>> editStartEvent​()
        EventType用于指示在事件触发的TreeView中启动了编辑事件。
        参数类型
        T - 此TreeView中使用的TreeItem实例的类型
        结果
        用于指示编辑事件已启动的EventType。
      • editCancelEvent

        public static <T> EventType<TreeView.EditEvent<T>> editCancelEvent​()
        EventType用于指示事件被触发的TreeView中刚刚取消了编辑事件。
        参数类型
        T - 此TreeView中使用的TreeItem实例的类型
        结果
        用于指示编辑事件刚刚被取消的EventType。
      • editCommitEvent

        public static <T> EventType<TreeView.EditEvent<T>> editCommitEvent​()
        用于指示TreeView中的编辑已提交的EventType。 这意味着用户对TreeItem的数据进行了更改,UI应该被更新。
        参数类型
        T - 此TreeView中使用的TreeItem实例的类型
        结果
        用于指示TreeView中的编辑已提交的EventType。
      • getNodeLevel

        @Deprecated(since="8u20")
        public static int getNodeLevel​(TreeItem<?> node)
        已过时。 此方法无法正确计算从给定TreeItem到TreeView根的距离。 从JavaFX 8.0_20开始,正确的方法是通过getTreeItemLevel(TreeItem)
        返回给定TreeItem的“缩进”级别数,基于可以递归调用的次数TreeItem.getParent() 如果TreeItem没有任何父集,则返回的值将为零。 对于每次递归调用getParent(),返回的值都将增加1。

        重要注意事项:此方法已被弃用,因为它不考虑根节点。 这意味着如果根节点有父节点,则此方法将遍历TreeView控件的根节点。 如果这很重要,请拨打getTreeItemLevel(TreeItem)

        参数
        node - 需要级别的TreeItem。
        结果
        表示给定节点上父节点数的整数,如果给定的TreeItem为空,则为-1。
      • setCellFactory

        public final void setCellFactory​(Callback<TreeView<T>,TreeCell<T>> value)
        设置将用于创建TreeCells的单元格工厂,用于表示TreeView中的项目。 该工厂与ListView中的cellFactory和其他复杂的复合控件相同。 只有当系统确定没有足够的单元格来表示当前可见的项目时,才需要创建一个新的TreeCell。 TreeCell被系统重用,可以在树中表示不同的项目。

        有关详细信息,请参阅Cell课程文档。

        参数
        value - 用于生成TreeCell实例的Callback ,如果应使用默认单元格工厂,则为null。
      • getCellFactory

        public final Callback<TreeView<T>,TreeCell<T>> getCellFactory​()

        返回用于创建TreeCells的单元格工厂,用于表示TreeView中的项目,如果未设置自定义单元格工厂,则返回null。

        结果
        电池厂
      • cellFactoryProperty

        public final ObjectProperty<Callback<TreeView<T>,TreeCell<T>>> cellFactoryProperty​()
        表示将用于创建TreeCells的单元格工厂,用于表示TreeView中的项目。
        结果
        电池厂属性
      • setRoot

        public final void setRoot​(TreeItem<T> value)
        设置此TreeView中的根节点。 有关更多详细信息,请参阅TreeItem类级别的文档。
        参数
        value - 将放置在TreeView根目录的TreeItem
      • getRoot

        public final TreeItem<T> getRoot​()
        返回此TreeView的当前根节点,如果未指定根节点,则返回null。
        结果
        当前根节点,如果没有根节点存在则为null。
      • setShowRoot

        public final void setShowRoot​(boolean value)
        指定是否应在此TreeView中显示根 TreeItem根。
        参数
        value - 如果为true,则将显示根 value ,如果为false,则它将被隐藏。
      • isShowRoot

        public final boolean isShowRoot​()
        如果应该显示TreeView的根,则返回true,否则返回false。 默认情况下,TreeView中的根树项目可见。
        结果
        如果应该显示TreeView的根,则为true
      • getSelectionModel

        public final MultipleSelectionModel<TreeItem<T>> getSelectionModel​()
        返回当前安装的选择模型。
        结果
        当前安装的选择模型
      • expandedItemCountProperty

        public final ReadOnlyIntegerProperty expandedItemCountProperty​()

        表示当前能够在TreeView中可见的树节点数。 这实质上是所有扩展的树项目及其子项的计数。

        例如,如果只有根节点可见,则expandItemCount将为1。 如果根有三个孩子并且根被扩大,那么这个值将是四个。

        从以下版本开始:
        JavaFX 8.0
        另请参见:
        getExpandedItemCount()
      • getExpandedItemCount

        public final int getExpandedItemCount​()
        获取属性expandedItemCount的值。
        Property description:

        表示当前能够在TreeView中可见的树节点数。 这实质上是所有扩展的树项目及其子项的计数。

        例如,如果只有根节点可见,则expandItemCount将为1。 如果根有三个孩子并且根被扩大,那么这个值将是四个。

        从以下版本开始:
        JavaFX 8.0
      • setFixedCellSize

        public final void setFixedCellSize​(double value)
        设置此控件的新固定单元格大小。 任何大于零的值将启用固定的单元大小模式,而零值或负值(或Region.USE_COMPUTED_SIZE)将用于禁用固定单元大小模式。
        参数
        value - 新的固定单元格大小值,或小于或等于零(或Region.USE_COMPUTED_SIZE)的值禁用。
        从以下版本开始:
        JavaFX 8.0
      • getFixedCellSize

        public final double getFixedCellSize​()
        返回固定的单元格大小值。 使用小于或等于零的值来表示禁用固定单元大小模式,大于零的值表示此控件中所有单元格的大小。
        结果
        表示该控件的固定单元大小的double,或者如果固定单元大小模式被禁用,小于或等于零的值。
        从以下版本开始:
        JavaFX 8.0
      • fixedCellSizeProperty

        public final DoubleProperty fixedCellSizeProperty​()
        指定此控件是否具有固定高度(指定值)的单元格。 如果该值小于或等于零,则所有单元格都被单独设置和定位。 这是一个缓慢的操作。 因此,当性能重要且开发人员不依赖于可变单元大小时,设置固定单元大小值是一个好主意。 一般情况下,单元格大约为24像素,因此设置固定的单元格大小为24可能导致视觉差异很小,但性能有所改善。

        要通过CSS设置此属性,请使用-fx-fixed-cell-size属性。 这不应该与-fx-cell-size属性混淆。 这两个CSS属性之间的区别是-fx-cell-size将所有单元格的大小设置为指定的大小,但不会强制这是唯一的大小(从而允许变量单元大小,并且阻止性能提升可能)。 因此,当性能很重要的时候使用-fx-fixed-cell-size,而不是-fx-cell-size。 如果在CSS中指定了两个属性,则-fx-fixed-cell-size优先。

        从以下版本开始:
        JavaFX 8.0
        另请参见:
        getFixedCellSize()setFixedCellSize(double)
      • setEditable

        public final void setEditable​(boolean value)
        设置属性可编辑的值。
        Property description:
        指定此TreeView是否可编辑 - 只有当TreeView和TreeCells都可编辑时,TreeCell才能进入编辑状态。
      • isEditable

        public final boolean isEditable​()
        获取可编辑属性的值。
        Property description:
        指定此TreeView是否可编辑 - 只有当TreeView和TreeCells都可编辑时,TreeCell才能进入编辑状态。
      • editableProperty

        public final BooleanProperty editableProperty​()
        指定此TreeView是否可编辑 - 只有当TreeView和TreeCells都可编辑时,TreeCell才能进入编辑状态。
        另请参见:
        isEditable()setEditable(boolean)
      • getEditingItem

        public final TreeItem<T> getEditingItem​()
        返回TreeView中当前正在编辑的TreeItem,如果没有编辑任何项目,则返回null。
        结果
        TreeView中当前正在编辑的TreeItem
      • layoutChildren

        protected void layoutChildren​()
        在布局传递过程中调用这个Parent的孩子。 默认情况下,它只会将受管理的可调整大小的内容的大小设置为其首选大小,并且不会执行任何节点定位。

        子类应该根据需要重写此函数以布局内容。

        重写:
        layoutChildrenControl
      • edit

        public void edit​(TreeItem<T> item)
        指示TreeView开始编辑给定的TreeItem,如果TreeView是editable 一旦调用此方法,如果当前的cell factory设置为支持编辑,Cell将切换其视觉状态以使用户输入。
        参数
        item - 应该编辑的TreeView中的TreeItem。
      • scrollTo

        public void scrollTo​(int index)
        滚动TreeView,使给定索引中的项目对最终用户可见。
        参数
        index - 应该对用户可见的索引,假定它大于或等于0,小于TreeView中可见项的数量。
      • getRow

        public int getRow​(TreeItem<T> item)
        返回给定TreeItem的索引位置,假设它目前可通过树层次结构访问(最显着的是所有父树项目都被扩展)。 如果父树项目被折叠,则结果是该方法将返回-1以指示树中不可访问给定树项。
        参数
        item - 寻找索引的TreeItem。
        结果
        一个整数,表示给定TreeItem的第一个实例的当前TreeView中的位置,如果为null,或者不能找到,则为-1(例如,如果父(一直到根)已折叠)。
      • getTreeItem

        public TreeItem<T> getTreeItem​(int row)
        返回给定索引中的TreeItem,如果超出范围则返回null。
        参数
        row - 正在寻找TreeItem的索引。
        结果
        给定索引中的TreeItem,如果超出范围,则为null。
      • getTreeItemLevel

        public int getTreeItemLevel​(TreeItem<?> node)
        根据getParent()可以递归调用的次数,返回给定TreeItem的“缩进”级别数。 如果给定的TreeItem是此TreeView的根节点,或者如果TreeItem没有任何父集,则返回的值将为零。 对于每次递归调用getParent(),返回的值都将增加1。
        参数
        node - 需要级别的TreeItem。
        结果
        表示给定节点上父节点数的整数,如果给定的TreeItem为空,则为-1。
      • createDefaultSkin

        protected Skin<?> createDefaultSkin​()
        为此控件创建一个新的默认皮肤实例。 如果没有通过CSS -fx-skin提供皮肤,或者在具有setSkin(...)的子类中显式设置,则调用此控件创建皮肤。
        重写:
        createDefaultSkinControl
        结果
        此控件的默认皮肤的新实例。 如果为null,则控件将没有皮肤,除非由css提供。
      • refresh

        public void refresh​()
        调用refresh()强制TreeView控件重新创建并重新填充填充控件的可视边界所需的单元格。 换句话说,这会强制TreeView更新它向用户显示的内容。 这在底层数据源以TreeView本身未观察到的方式发生更改的情况下很有用。
        从以下版本开始:
        JavaFX 8u60
      • getClassCssMetaData

        public static List<CssMetaData<? extends Styleable,?>> getClassCssMetaData​()
        结果
        与此类相关联的CssMetaData可能包括其类的CssMetaData。
        从以下版本开始:
        JavaFX 8.0
      • queryAccessibleAttribute

        public Object queryAccessibleAttribute​(AccessibleAttribute attribute,
                                               Object... parameters)
        该方法由辅助技术调用以请求属性的值。

        子类通常覆盖此方法来实现特定角色所需的属性。
        如果未处理特定属性,则必须调用超类实现。

        重写:
        queryAccessibleAttributeControl
        参数
        attribute - 请求的属性
        parameters - 可选参数列表
        结果
        请求的属性的值
        另请参见:
        AccessibleAttribute