JavaFX: FXML: Как заставить ребенка расширять свой размер, чтобы он соответствовал родительской панели?
Мне удалось загрузить дочерний fxml (sub UI) под родительский fxml (mainMenu UI).
Я создал AnchorPane с id "mainContent" . Эта панель связана с четырьмя сторонами и изменяется в соответствии со стадией.
Детское окно будет загружено в анкерную панель mainContent. Однако я не могу понять, как заставить ребенка меняться вместе с его родительским "mainContent" .
Мой дочерний UI вызывается так.
@FXML
private void mnuUserLevel_onClick(ActionEvent event) {
FXMLLoader loader = new FXMLLoader(getClass().getResource("DBedit.fxml"));
loader.setController(new DBeditEntityUserlevel());
try {
Node n = (Node)loader.load();
mainContent.getChildren().add(n);
} catch (IOException e){
System.out.println(e.getMessage());
}
}
Чтобы проиллюстрировать мой вопрос, см. мой снимок. Красный квадрат - это ребенок. Желтый квадрат - это AnchorPane "mainContent" родителя MainMenu.
![enter image description here]()
Ответы
Ответ 1
Если вы установили значения topAnchor, bottomAnchor, leftAnchor, rightAnchor для панели внутри вашей AnchorPane до 0.0, панель будет растянута на всю длину окружающего AnchorPane.
Ссылка на документацию: AnchorPane
edit: в ссылке документации вы также можете увидеть, как вы можете установить эти значения в своем java-коде.
Пример FXML:
<AnchorPane fx:id="mainContent" ...>
<StackPane fx:id="subPane" AnchorPane.topAnchor="0.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" ></StackPane>
</AnchorPane>
Ответ 2
Если у вас есть Region
, который является подклассом Node
, который включает в себя Axis
, Chart
, Control
и Pane
(это, вероятно, включает все, что вы захотите загрузить), вы может привязать размер ребенка к пространству в родительском объекте, похожий на то, как они делали здесь. Теперь любые будущие корректировки размера родителя будут отражены в дочернем элементе.
Region n = (Region)loader.load();
mainContent.getChildren().add(n);
n.prefWidthProperty().bind(mainContent.widthProperty());
n.prefHeightProperty().bind(mainContent.heightProperty());
Ответ 3
С учетом структуры вашего интерфейса, я думаю, вам лучше использовать BorderPane в качестве родительского контейнера с этим предложением, не используйте AnchorPane непосредственно внутри контейнера BorderPane, вот мое предложение, которое вы делаете:
-> BorderPane-Top = "ваше меню"
-> BorderPane-Center = другой контейнер (может быть SplitPane, другой BorderPane и т.д., Но не AnchorPane, я думаю, но вы можете попробовать, если хотите)
-> BorderPane-Bottom = другой контейнер (может быть hbox с кнопками или меткой для информации или уведомлений и т.д..)
Ответ 4
Вы можете попробовать с настройкой prefWidth. Я не знаю почему, но похоже, что он берет prefWidth, установленную в SceneBuilder, после ссылки на newPane на AnchorPane.
Node newPane = FXMLLoader.load(getClass().getResource("view/YourPane.fxml"));
List<Node> parentChildren = ((Pane)yourAnchorPaneId.getParent()).getChildren();
parentChildren.set(parentChildren.indexOf(yourAnchorPaneId), newPane);
yourAnchorPaneId.setPrefWidth(1800); // 1800 just example value for test
Main.primaryStage.setWidth(500); // 500 example value with which you wishe to start app
Ответ 5
Метод 1:
// @FXML private AnchorPane pnlContainer;
FXMLLoader loader = new FXMLLoader(getClass().getResource("Demo.fxml"));
Node _node = loader.load();
_node.prefWidth(pnlContainer.widthProperty().doubleValue());
_node.prefHeight(pnlContainer.heightProperty().doubleValue());
// container child clear
pnlContainer.getChildren().clear();
// new container add
pnlContainer.getChildren().add(_node);
Альтернативный метод;
FXMLLoader loader = new FXMLLoader(getClass().getResource("Demo.fxml"));
Node _node = loader.load();
AnchorPane.setTopAnchor(_node, 0.0);
AnchorPane.setRightAnchor(_node, 0.0);
AnchorPane.setLeftAnchor(_node, 0.0);
AnchorPane.setBottomAnchor(_node, 0.0);
// container child clear
pnlContainer.getChildren().clear();
// new container add
pnlContainer.getChildren().add(_node);
Подробная ссылка на метод 2: JavaFX Panel внутри Panel с автоматическим изменением размера