最近,我发现<ComboBox>
- 和其他控件 - 可以在其下面放置<items>
元素。
如何在FXML标记中填充或添加项目到控件?
(一个用例可能是将FXML作为模型展示给利益相关者。)
答案 0 :(得分:8)
研究证明,它是通过fx:value
和fx: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>
ControlsFX控件略有不同:
<CheckComboBox>
<items>
<String fx:value="One"/>
<String fx:value="Two"/>
<String fx:value="Three"/>
</items>
</CheckComboBox>
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>