Подтвердить что ты не робот

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

4b9b3361

Ответ 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 с автоматическим изменением размера