我已经开始使用JavaFX进行编程。
我的问题是我真的不理解场景构建器和“普通”代码之间的联系。
我有一个新的FXML文档和这样的代码
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
我可以通过Scene Builder添加一些元素。它工作正常。 但现在我想添加一个带有一些值的ChoiceBox。我可以通过Scene Builder添加一个空白的ChoiceBox。但没有价值......
所以我找到一些代码来创建一个值为
的ChoiceBoxChoiceBox 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()MethodeAnchorPane root = new AnchorPane();
但是我必须通过代码编写所有内容,而不是通过Scene Builder编写代码。这样对吗?或者有没有办法将“普通”代码和场景构建器功能结合起来?
由于
答案 0 :(得分:2)
FXML只是一种创建对象结构的方法。创建后对这些对象的处理完全取决于您。如果从fxml创建场景图,则可以使用从{1}创建的对象Node
来执行相同的操作,包括将子项添加到Pane
并设置{的项目{1}} ...只需使用ChoiceBox
属性将相关节点注入控制器,然后使用fx:id
实例来加载控制器实例FXML。
示例:
FXMLLoader
<?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));
}
}