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

Class ComboBox<T>

  • 参数类型
    T - 已选择或以其他方式输入到此组合框的值的类型
    All Implemented Interfaces:
    StyleableEventTargetSkinnable


    public class ComboBox<T>
    extends ComboBoxBase<T>
    对于最常见的ComboBox形式的ComboBoxBase抽象类的实现,其中向用户提供弹出列表,以提供他们可以选择的选项。 有关ComboBox的一般概念和API的更多信息,请参阅ComboBoxBase类文档。

    在ComboBoxBase之上,ComboBox类引入了额外的API。 最重要的是,它添加了一个items属性,其工作方式与ListView items属性的方式大致相同。 换句话说,当用户单击ComboBox按钮时,它是向用户显示的项目列表的内容。

    ComboBox从ComboBoxBase公开了ComboBoxBase.valueProperty() ,但是有一些关于ComboBox需要理解的值属性的一些重要点。 这些包括:

    1. value属性限制于包含的项目列表中的项目-它可以是任何东西,只要它是T类型的有效值
    2. 如果将value属性设置为非空对象,并且随后清除了项目列表,则value属性不会被清空。
    3. 清除选择模型selection 不会使值属性为空 - 它与以前保持一致。
    4. 即使列表中没有项目(或列表中的项目少于给定索引),选择模型也可以将选择集设置为给定的索引。 一旦项目列表进一步填充,使得列表包含足够的项目以使给定索引中的项目,选择模型SelectionModel.selectedItemProperty()和值属性将被更新为具有该值。 这与使用选择模型的其他控件不一致,但是有意为ComboBox进行操作。

    默认情况下,当弹出列表显示时,可见的最大行数为10,但可以通过修改visibleRowCount属性来更改。 如果ComboBox中的项目数量小于visibleRowCount的值,则将使用项目大小,以使弹出列表不会很长。

    与ListView一样,可以修改所使用的selection model ,尽管这很可能很少改变。 这是因为ComboBox强制需要一个SingleSelectionModel实例,并不太可能需要替代的实现。 尽管如此,选择是应该使用案例来切换选择模型。

    由于ComboBox使用ListView内部呈现内容,所以在ComboBox类中存在API,以允许设置自定义单元格工厂。 有关电池厂的更多信息,请参阅CellListCell类。 重要的是要注意,如果单元格工厂设置在ComboBox上,单元格将仅在ListView中使用,该单元格显示何时单击组合框。 如果您还要自定义ComboBox“按钮”区域的渲染,可以在button cell属性中设置自定义的ListCell实例。 一种方法是使用以下代码(注意使用setButtonCell

       Callback<ListView<String>, ListCell<String>> cellFactory = ...; ComboBox comboBox = new ComboBox(); comboBox.setItems(items); comboBox.setButtonCell(cellFactory.call(null)); comboBox.setCellFactory(cellFactory); 

    因为ComboBox可以是editable ,并且允许用户输入的默认方式是通过TextField ,提供string converter属性,以允许开发人员指定如何将用户字符串转换为类型T的对象,使得27069266292882属性可以包含它 默认情况下,转换器只是按用户输入的方式返回String输入,因此假设可编辑ComboBox的类型为String。 如果指定了不同的类型,ComboBox是可编辑的,则需要指定自定义的StringConverter

    关于将节点插入ComboBox项目列表中的警告

    ComboBox允许项目列表包含任何类型的元素,包括Node实例。 将节点放置在项目列表中是不推荐的 这是因为默认的cell factory将节点项直接插入到单元格中,包括ComboBox的“按钮”区域。 因为场景图片一次允许节点在一个位置,这意味着当选择项目时,它将从ComboBox列表中删除,并在按钮区域中变得可见。 当选择更改时,先前选择的项目返回到列表,并且删除新的选择。

    推荐的方法,而不是将节点实例插入到项目列表中,是将相关信息放入ComboBox中,然后提供自定义的cell factory 例如,而不是使用以下代码:

       ComboBox<Rectangle> cmb = new ComboBox<Rectangle>(); cmb.getItems().addAll( new Rectangle(10, 10, Color.RED), new Rectangle(10, 10, Color.GREEN), new Rectangle(10, 10, Color.BLUE)); 

    您应该执行以下操作:

       ComboBox<Color> cmb = new ComboBox<Color>(); cmb.getItems().addAll( Color.RED, Color.GREEN, Color.BLUE); cmb.setCellFactory(new Callback<ListView<Color>, ListCell<Color>>() { @Override public ListCell<Color> call(ListView<Color> p) { return new ListCell<Color>() { private final Rectangle rectangle; { setContentDisplay(ContentDisplay.GRAPHIC_ONLY); rectangle = new Rectangle(10, 10); } @Override protected void updateItem(Color item, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { setGraphic(null); } else { rectangle.setFill(item); setGraphic(rectangle); } } }; } }); 

    诚然,上述方法更详细,但它提供了所需的功能,而不会遇到场景图限制。

    从以下版本开始:
    JavaFX 2.1
    另请参见:
    ComboBoxBaseCellListCellStringConverter