it-swarm.com.ru

JavaFX: FXML: как заставить дочерний элемент увеличить свой размер, чтобы он соответствовал родительской панели?

Мне удалось загрузить дочерний fxml (дочерний интерфейс) под родительским fxml (mainMenu UI) . Я создал AnchorPane с идентификатором mainContent Эта панель связана с 4 сторонами и изменяется в соответствии со сценой. 

Дочернее окно будет загружено в область привязки mainContent. Тем не менее, я не могу понять, как заставить ребенка меняться вместе с его родительским "mainContent". 

Мой детский интерфейс называется так.

@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 родительского объекта MainMenu.

enter image description here

18
Dean Chiu

Если вы установите значения 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>
37
Sascha B

Если у вас есть Region, который является подклассом из Node, который включает в себя Axis, Chart, Control и Pane (это, вероятно, включает в себя все, что вы хотите загрузить), вы можете bind размер дочернего в пространство в родительском пространстве, как они сделали здесь . Теперь любые будущие корректировки размера родителя будут отражены в ребенке.

Region n = (Region)loader.load();
mainContent.getChildren().add(n);
n.prefWidthProperty().bind(mainContent.widthProperty());
n.prefHeightProperty().bind(mainContent.heightProperty());
22
EthanP

С учетом структуры вашего интерфейса, я думаю, вам лучше использовать BorderPane в качестве родительского контейнера с этим предложением, не используйте AnchorPane непосредственно внутри контейнера BorderPane, вот мое предложение, которое вы делаете:

-> BorderPane-Top = "ваше меню"

-> BorderPane-Center = другой контейнер (может быть SplitPane, другой BorderPane и т.д., Но не AnchorPane, я думаю, но вы можете попробовать, если хотите)

-> BorderPane-Bottom = другой контейнер (может быть hbox с кнопками или меткой для информации или уведомлений и т.д ..)

0
mike_s

Вы можете попробовать установить 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
0
blumberk1990