【问题标题】:JavaFX / FXML add ChoiceBox to root PaneJavaFX / FXML 将 ChoiceBox 添加到根窗格
【发布时间】: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。这样对吗?或者有没有办法将“普通”代码和场景构建器功能结合起来?

谢谢

【问题讨论】:

    标签: java javafx fxml


    【解决方案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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 2015-10-15
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多