如何使用FXML将项添加到ComboBox(或其他控件)?

时间:2017-12-22 18:57:02

标签: javafx controls fxml

最近,我发现<ComboBox> - 和其他控件 - 可以在其下面放置<items>元素。

如何在FXML标记中填充或添加项目到控件?

(一个用例可能是将FXML作为模型展示给利益相关者。)

1 个答案:

答案 0 :(得分:8)

研究证明,它是通过fx:valuefx:factory属性的组合完成的。这些似乎已添加到 JavaFX 8 JavaFX 2

请注意,正如@fabian所做的那样,打破 模型视图之间的分离 - 这可能是长期不良后果。

  

FX:值

     

fx:value属性可用于初始化没有默认构造函数但提供静态valueOf(String)方法的类型的实例。例如,java.lang.String以及每个原始包装类型定义了一个valueOf()方法,可以在FXML中构造如下:

<String fx:value="Hello, World!"/>
<Double fx:value="1.0"/>
<Boolean fx:value="false"/>
  

定义静态valueOf(String)方法的自定义类也可以这种方式构造。

  

FX:工厂

     

fx:factory属性是创建其类没有默认构造函数的对象的另一种方法。该属性的值是用于生成类实例的静态,无arg工厂方法的名称。例如,以下标记创建一个可观察数组列表的实例,填充三个字符串值:

<FXCollections fx:factory="observableArrayList">
    <String fx:value="A"/>
    <String fx:value="B"/>
    <String fx:value="C"/>
</FXCollections>

一些例子:

组合框

<ComboBox value="One">
    <items>
        <FXCollections fx:factory="observableArrayList">
            <String fx:value="Three"/>
            <String fx:value="Two"/>
            <String fx:value="One"/>
        </FXCollections>
    </items>
</ComboBox>

ComboBox in FXML with default value

CheckComboBox

ControlsFX控件略有不同:

<CheckComboBox>
    <items>
        <String fx:value="One"/>
        <String fx:value="Two"/>
        <String fx:value="Three"/>
    </items>
</CheckComboBox>

checkcombobox

TableView

TableView变得有点复杂,因为它需要CellValueFactory来知道要在每列中显示的Person部分。

<TableView prefHeight="200.0" prefWidth="200.0">
    <columns>
     <TableColumn text="Name">
        <cellValueFactory>
            <PropertyValueFactory property="name" />
        </cellValueFactory>
     </TableColumn>
     <TableColumn text="Comment">
        <cellValueFactory>
            <PropertyValueFactory property="comment" />
        </cellValueFactory>
     </TableColumn>
    </columns>  
    <items>
        <FXCollections fx:factory="observableArrayList">
            <Person name="Jacob" comment="Hey!"/>
            <Person name="Isabella" comment="Dude, we're in FXML!"/>
            <Person name="Ethan" comment="No way!"/>
        </FXCollections>
    </items>
</TableView>

TableView in FXML