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 创建一个场景图,您可以使用 Nodes 执行与从 java 代码创建的对象相同的操作,包括将子级添加到 Panes 并设置 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呈现的用户界面?

JavaFX:如何从 MenuItem 更改场景 (FXML)

javafx fxml ComboBox错误

JavaFX: FXML嵌套和子Controller(Sub-Controller)