如何在FXML中将节点添加到另一个节点的子节点?

时间:2015-06-02 11:52:38

标签: javafx fxml

我想要获得的示例,用Java代码编写:

public class Main extends Application {

    private static Scene scene;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void init() throws IOException {
        // Load root pane from FXML file.
        URL url = getClass().getResource("sample.fxml");
        StackPane root = FXMLLoader.load(url);
        // Create scene for a root node on JavaFX thread.
        Platform.runLater(() -> scene = new Scene(root, 600, 400));
    }

    @Override
    public void start(Stage stage) {
        stage.setScene(scene);
        stage.show();
    }

}

自定义节点:

public class CustomGroup extends Group {

    private VBox contentPane = new VBox();

    public CustomGroup() {
        getChildren().add(contentPane);
        contentPane.getChildren().add(new Label("First Label"));
        contentPane.getChildren().add(new Label("Second Label"));
    }

}

FXML:

<StackPane>
    <CustomGroup/>
</StackPane>

上面的代码是我想要获得的代码的示例,但我不想在Java代码中添加标签,而是想在FXML中添加它们。这样的事情:

<StackPane>
    <CustomGroup>
         <Label text="First Label"/>
         <Label text="Second Label"/>
    </CustomGroup>
</StackPane>

但这会为自定义组添加标签。我想将它们添加到自定义组的内容窗格(VBox)。

1 个答案:

答案 0 :(得分:3)

虽然,我不确定你为什么要在CustomGroup的构造函数中将标签添加到VBox中,但我会忽略它并回答你的问题。

您可以添加单独的方法将项目添加到VBox。让我们考虑一下方法:

  • setItems()接受Nodes将其添加到VBox
  • getItems()从VBox
  • 返回ObservableList<Node>

<强> CustomGroup

public class CustomGroup extends Group {

    private VBox contentPane = new VBox();

    public CustomGroup() {
        getChildren().add(contentPane);
        contentPane.getChildren().add(new Label("First Label"));
        contentPane.getChildren().add(new Label("Second Label"));
    }

    public void setItems(Node...nodes) {
        contentPane.getChildren().addAll(nodes);
    }

    public ObservableList<Node> getItems() {
        return contentPane.getChildren();
    }

}

<强> FXML

<CustomGroup>
  <items>
    <Button text="hi"/>
  </items>
</CustomGroup>

此FXML在VBox

中添加了新Button