Module  javafx.controls

Class CheckBoxTreeCell<T>

  • 参数类型
    T - TreeView TreeItem实例中包含的元素的类型。
    All Implemented Interfaces:
    StyleableEventTargetSkinnable


    public class CheckBoxTreeCell<T>
    extends TreeCell<T>
    一个包含TreeCell实现的类,它在单元格中绘制一个CheckBox节点,同时支持常见的交互( 稍后更详细地讨论)。

    要使用CheckBox创建TreeView更容易,提供了一个名为CheckBoxTreeItem的便利类。 强烈建议开发人员在构建其TreeView树结构时使用此类,而不是常规的TreeItem类。 有关如何组合这两个类的示例,请参阅CheckBoxTreeItem API文档。

    当在TreeView中使用时,CheckBoxCell将使用“披露节点”右侧的复选框(即箭头)呈现。 然后,存储在TreeItem.getValue()的项目将会调用StringConverter,此文本将占用所有剩余的水平空间。 另外,通过使用CheckBoxTreeItem ,TreeView会自动处理以下情况:

    • 点击CheckBox旁边有一个项目的孩子将导致所有的孩子也被选中/未选择。
    • 点击CheckBox旁边一个有父项的项目可能会切换父级的状态。 例如,如果您选择一个孩子,父母将变得不确定(指示部分选择孩子)。 如果继续选择所有孩子,父母将显示它也被选中。 这是递归的,所有父节点按预期更新。
    如果决定,使用CheckBoxTreeItem是不可取的,那么就需要调用其中一个构造函数Callback提供了可以返回ObservableValue<Boolean>给予TreeItem实例。 这个ObservableValue<Boolean>应该表示给定的TreeItem的布尔状态。

    请注意,CheckBoxTreeCell呈现CheckBox“live”,这意味着CheckBox始终是交互式的,可以由用户直接切换。 这意味着单元格不需要输入其editing state (通常由用户双击单元格)。 这样做的副作用是 不会调用通常的编辑回调(如on edit commit )。 如果要通知更改,建议直接观察CheckBox操作的布尔属性。

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

      • CheckBoxTreeCell

        public CheckBoxTreeCell​(Callback<TreeItem<T>,ObservableValue<Boolean>> getSelectedProperty)
        创建一个CheckBoxTreeCell用于通过单元格工厂的TreeView控件。 CheckBoxTreeCell()不同,该方法不会假定TreeView中的所有TreeItem实例都是CheckBoxTreeItem

        要调用此方法,有必要提供一个Callback ,给定一个TreeItem <T>类型的对象,将返回一个表示给定项目是否被选择的ObservableValue<Boolean> 这个ObservableValue<Boolean>将双向绑定(这意味着单元格中的复选框将基于用户交互设置/取消设置此属性,如果外部更改,则复选框将反映ObservableValue<Boolean>的状态)。

        如果项目不是CheckBoxTreeItem实例,则开发人员负责处理更新父项和子项TreeItems的状态。 这意味着,给定一个TreeItem,这个类将简单地切换提供的ObservableValue<Boolean> ,而不是更多。 当然,这个功能可以通过向ObservableValue<Boolean>添加观察者来外部实现,并根据需要切换其他属性的状态。

        参数
        getSelectedProperty - A Callback将返回一个ObservableValue<Boolean> ,表示给定项目是否被选择。
      • CheckBoxTreeCell

        public CheckBoxTreeCell​(Callback<TreeItem<T>,ObservableValue<Boolean>> getSelectedProperty,
                                StringConverter<TreeItem<T>> converter)
        创建一个CheckBoxTreeCell用于通过单元格工厂的TreeView控件。 CheckBoxTreeCell()不同,该方法不会假定TreeView中的所有TreeItem实例都是CheckBoxTreeItem

        要调用此方法,有必要提供一个Callback ,给定一个TreeItem <T>类型的对象将返回一个ObservableValue<Boolean> ,表示给定项是否被选择。 这个ObservableValue<Boolean>将双向绑定(这意味着单元格中的复选框将基于用户交互设置/取消设置此属性,而复选框将反映ObservableValue<Boolean>的状态,如果外部更改)。

        如果项目不是CheckBoxTreeItem实例,则开发人员负责处理更新父和子TreeItems的状态。 这意味着,给定一个TreeItem,这个类将简单地切换提供的ObservableValue<Boolean> ,而不是更多。 当然,这个功能可以通过向ObservableValue<Boolean>添加观察者来外部实现,并根据需要切换其他属性的状态。

        参数
        getSelectedProperty - A Callback将返回一个表示给定项目是否被选择的ObservableValue<Boolean>
        converter - 给一个类型为TreeItem <T>的对象的StringConverter将返回一个可以用于可视化表示对象的String。
    • 方法详细信息

      • forTreeView

        public static <T> Callback<TreeView<T>,TreeCell<T>> forTreeView​()
        创建在TreeView控件中使用的单元格工厂,尽管在TreeView中使用时有一个主要假设:此单元格工厂假定TreeView根和所有子项都是CheckBoxTreeItem实例,而不是正常使用的默认TreeItem类。

        当在TreeView中使用时,CheckBoxCell将使用“披露节点”右侧的复选框(即箭头)呈现。 存储在TreeItem.getValue()的项目将在其上调用StringConverter,并且此文本将占用所有剩余的水平空间。 另外,通过使用CheckBoxTreeItem ,TreeView将自动处理以下情况:

        • 点击CheckBox旁边有一个项目的孩子将导致所有的孩子也被选中/未选择。
        • 点击CheckBox旁边一个有父项的项目可能会切换父级的状态。 例如,如果您选择一个孩子,父母将变得不确定(指示部分选择孩子)。 如果继续选择所有孩子,父母将显示它也被选中。 这是递归的,所有父节点按预期更新。

        不幸的是,由于Java的限制,使用这种方法时需要提供一个显式的转换。 例如:

           final TreeView<String> treeView = new TreeView<String>(); treeView.setCellFactory(CheckBoxCell.<String>forTreeView()); 
        参数类型
        T - CheckBoxTreeItem实例中包含的元素的类型。
        结果
        A Callback将返回一个TreeCell,它能够处理TreeView根目录中包含的元素及其所有子项(递归)。
      • forTreeView

        public static <T> Callback<TreeView<T>,TreeCell<T>> forTreeView​(Callback<TreeItem<T>,ObservableValue<Boolean>> getSelectedProperty)
        创建一个用于TreeView控件的单元格工厂。 forTreeView()不同,此方法不会假定TreeView中的所有TreeItem实例都是CheckBoxTreeItem实例。

        当在TreeView中使用时,CheckBoxCell将使用“披露节点”右侧的复选框(即箭头)呈现。 然后,存储在TreeItem.getValue()的项目将会调用StringConverter,此文本将占用所有剩余的水平空间。

        不像forTreeView() ,这个单元格工厂不处理更新父项或子ObservableValue<Boolean> TreeItems的状态 - 它只是切换提供的ObservableValue<Boolean> ,而不是更多。 当然,这个功能可以通过向ObservableValue<Boolean>添加观察者来外部实现,并根据需要切换其他属性的状态。

        参数类型
        T - TreeItem实例中包含的元素的类型。
        参数
        getSelectedProperty - 一个Callback ,给定一个类型为TreeItem <T>的对象,将返回一个ObservableValue<Boolean> ,表示给定项是否被选择。 这个ObservableValue<Boolean>将双向绑定(这意味着单元格中的复选框将基于用户交互设置/取消设置此属性,如果外部更改,则复选框将反映ObservableValue<Boolean>的状态)。
        结果
        A Callback将返回一个TreeCell,它可以处理TreeView根目录中包含的元素类型及其所有子项(递归))。
      • forTreeView

        public static <T> Callback<TreeView<T>,TreeCell<T>> forTreeView​(Callback<TreeItem<T>,ObservableValue<Boolean>> getSelectedProperty,
                                                                        StringConverter<TreeItem<T>> converter)
        创建一个用于TreeView控件的单元格工厂。 forTreeView()不同,该方法不会假定TreeView中的所有TreeItem实例都是CheckBoxTreeItem

        当在TreeView中使用时,CheckBoxCell将使用“披露节点”右侧的复选框(即箭头)呈现。 然后,存储在TreeItem.getValue()的项目将会调用StringConverter,此文本将占用所有剩余的水平空间。

        不像forTreeView() ,这个单元格工厂不处理更新父项或子ObservableValue<Boolean> TreeItems的状态 - 它只是切换提供的ObservableValue<Boolean> ,而不是更多。 当然,可以通过向ObservableValue<Boolean>添加观察者来外部实现该功能,并根据需要切换其他属性的状态。

        参数类型
        T - TreeItem实例中包含的元素的类型。
        参数
        getSelectedProperty - 给定一个TreeItem <T>类型的对象的回调将返回一个ObservableValue<Boolean> ,表示给定项是否被选择。 这个ObservableValue<Boolean>将双向绑定(这意味着单元格中的复选框将基于用户交互设置/取消设置此属性,而复选框将反映ObservableValue<Boolean>的状态,如果外部更改)。
        converter - 提供TreeItem <T>类型的对象的StringConverter将返回一个可以用来直观地表示对象的String。 forTreeView(Callback)的默认实现是简单地在所有非空项目上调用.toString()(并且在给定项目为空的情况下只返回一个空字符串)。
        结果
        A Callback将返回一个TreeCell,它可以处理TreeView根目录中包含的元素及其所有子项(递归)。
      • updateItem

        public void updateItem​(T item,
                               boolean empty)
        updateItem方法不应该被开发人员调用,但它是开发人员覆盖的最佳方式,以允许它们自定义单元格的视觉效果。 为了澄清,开发人员不应该在他们的代码中调用这个方法(他们应该留给UI控件,如ListView控件)来调用这个方法。 然而,使用updateItem方法的目的是使开发人员在指定自定义单元工厂时(再次像ListView cell factory ),可以覆盖updateItem方法以允许对单元格进行完全自定义。

        非常重要的是,Cell的子类会正确覆盖updateItem方法,因为这样做会导致诸如空白单元格或其中出现意外内容的单元格等问题。 以下是如何正确覆盖updateItem方法的示例:

          protected void updateItem(T item, boolean empty) {
             super.updateItem(item, empty);
        
             if (empty || item == null) {
                 setText(null);
                 setGraphic(null);
             } else {
                 setText(item.toString());
             }
         } 

        注意在这段代码示例中的两个重点:

        1. 我们称之为super.updateItem(T,boolean)方法。 如果没有这样做,项目和空属性设置不正确,您可能会遇到图形问题。
        2. 我们测试empty条件,如果为true,我们将文本和图形属性设置为null。 如果我们不这样做,几乎可以保证最终用户意外地看到细胞中的图形工件。
        参数
        item - 单元格的新项目。
        empty - 该单元格是否表示列表中的数据。 如果它是空的,那么它不表示任何域数据,而是用于呈现“空”行的单元格。