web-dev-qa-db-fra.com

JavaFX: FXML: Comment obliger l'enfant à étendre sa taille pour l'adapter au volet parent?

J'ai réussi à charger un fxml enfant (sous-interface utilisateur) sous un fxml parent (mainMenu UI) .J'ai créé un AnchorPane avec l'id "mainContent". Ce volet est lié à 4 côtés et les changements d’accord sur la scène. 

La fenêtre enfant sera chargée dans le "mainContent" anchorpane. Cependant, je ne vois pas comment faire en sorte que l'enfant change avec son parent "mainContent". 

Mon enfant l'interface utilisateur s'appelle comme ça.

@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());
    }
}

Pour illustrer davantage ma question, veuillez consulter mon instantané. Le carré rouge est l'enfant. Le carré jaune est le volet "mainContent" du parent MainMenu.

enter image description here

18
Dean Chiu

Si vous définissez les valeurs topAnchor, bottomAnchor, leftAnchor, rightAnchor du volet de votre panneau d'ancrage sur 0.0, le panneau sera étiré sur toute l'étendue du volet d'ancrage environnant.

Lien à la documentation: AnchorPane

edit: dans le lien de la documentation, vous pouvez également voir comment définir ces valeurs dans votre code Java.

Exemple 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

Si vous avez une Region, qui est une sous-classe sur Node qui inclut Axis, Chart, Control et Pane (cela inclut probablement tout ce que vous pouvez charger), vous pouvez bind lier à l'espace dans le parent semblable à la façon dont ils ont fait ici . Maintenant, tout ajustement futur de la taille du parent sera reflété dans l'enfant.

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

En regardant la structure de votre interface, je pense que vous feriez mieux d'utiliser BorderPane comme conteneur parent avec cette suggestion. N'utilisez pas AnchorPane directement dans le conteneur BorderPane. Voici ma suggestion:

-> BorderPane-Top = "votre menu"

-> BorderPane-Center = un autre conteneur (pourrait être SplitPane, un autre BorderPane, etc. mais pas AnchorPane je suppose mais vous pouvez essayer si vous voulez)

-> BorderPane-Bottom = un autre conteneur (par exemple, hbox avec des boutons ou une étiquette pour les informations ou les notifications, etc.)

0
mike_s

Vous pouvez essayer avec la configuration de prefWidth. Je ne sais pas pourquoi, mais il semble qu'il faille la prefWidth définie dans SceneBuilder après avoir référencé votre newPane à votre 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