JavaFX / FXML 将 ChoiceBox 添加到根窗格
Posted
技术标签:
【中文标题】JavaFX / FXML 将 ChoiceBox 添加到根窗格【英文标题】:JavaFX / FXML add ChoiceBox to root Pane 【发布时间】:2016-05-15 07:40:39 【问题描述】:我已经开始用 JavaFX 编程了。
我的问题是我不太了解场景构建器和“正常”代码之间的联系。
我有一个新的 FXML 文档和这样的代码
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
我可以通过 Scene Builder 添加一些元素。它工作正常。 但现在我想添加一个带有一些值的选择框。我可以通过 Scene Builder 添加一个空白的 ChoiceBox。但没有价值观……
所以我找到了一些创建具有值的选择框的代码
ChoiceBox cb = new ChoiceBox();
cb.setItems(FXCollections.observableArrayList("Eins","Zwei","Drei","vier"));
cb.setValue("Zwei");
cb.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener()
@Override
public void changed(ObservableValue observable, Object oldValue, Object newValue)
System.out.println(cb.getValue());
);
它也很好用。但是我怎样才能将它添加到我的场景中呢?我认为以下代码行对我不起作用,因为我的根元素有一个 FMXLLoader
root.getChildren().add(cb);
我认为只有当你使用类似这样的东西时你才有 getChildren() 方法
AnchorPane root = new AnchorPane();
但是我必须通过代码对所有内容进行编码,而无需通过 Scene Builder。这样对吗?或者有没有办法将“普通”代码和场景构建器功能结合起来?
谢谢
【问题讨论】:
【参考方案1】:FXML 只是一种创建对象结构的方法。创建后如何处理这些对象完全取决于您。如果您从 fxml 创建一个场景图,您可以使用 Node
s 执行与从 java 代码创建的对象相同的操作,包括将子级添加到 Pane
s 并设置 ChoiceBox
.. . 只需使用fx:id
属性将相关节点注入控制器,然后使用FXMLLoader
instance 加载fxml 来获取控制器实例。
例子:
message.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<VBox fx:id="root" prefHeight="400.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxmltest.MessageController">
</VBox>
public class MessageController
@FXML
private VBox root;
public void addMessage(String message)
root.getChildren().add(new Label(message));
FXMLLoader loader = new FXMLLoader(getClass().getResource("message.fxml"));
Parent root = loader.load();
MessageController controller = loader.getController();
controller.addMessage("Hello World");
controller.addMessage("42");
【讨论】:
以上是关于JavaFX / FXML 将 ChoiceBox 添加到根窗格的主要内容,如果未能解决你的问题,请参考以下文章
JavaFX 动态地将标签添加到窗格,在 fxml 文件中定义
如何使用不同的 fxml 文件创建多个 javafx 控制器?
我如何将javax.swing.ImageIcon绘制为JavaFX .fxml呈现的用户界面?