Для замены части содержимого есть более подходящие макеты, чем GridPane
, но в основном вам необходимо использовать родительский элемент для ToolBar
, который позволяет заменить дополнительного потомка.В этом случае BorderPane
, вероятно, будет хорошей идеей, но это может быть сделано и с GridPane
;это просто менее элегантно.
<BorderPane fx:id="container" fx:controller="main.java.Controller"
xmlns:fx="http://javafx.com/fxml">
<top>
<ToolBar prefHeight="40.0" prefWidth="400.0">
<Button text="testButton" onAction="#testButton"/>
</ToolBar>
</top>
</BorderPane>
@FXML
private BorderPane container;
@FXML
private void testButton1() throws IOException {
try {
container.setCenter(FXMLLoader.load(getClass().getResource("src/testButton1.fxml")));
container.getScene().getWindow().sizeToScene(); // resize scene to fit the full size of the content
} catch (IOException e) {
e.printStackTrace();
}
}
Если вы продолжаете использовать GridPane
, введите его, используя fx:id
, убедитесь, что ToolBar
- единственный ребенок, которого вы хотите сохранить, этопервый ребенок и единственный ребенок, расположенный в rowIndex=0, columnIndex=0)
, вы также можете вручную удалить дополнительных детей:
@FXML
private GridPane container;
@FXML
private void testButton1() throws IOException {
ObservableList<Node> children = container.getChildren();
children.remove(1, children.size()); // remove every child after the first
try {
container.add(FXMLLoader.load(getClass().getResource("src/testButton1.fxml")), 0, 1);
container.getScene().getWindow().sizeToScene(); // resize scene to fit the full size of the content
} catch (IOException e) {
e.printStackTrace();
}
}