Scene Graph
El graf d’escena (scene graph) és l’arbre de nodes que forma la interfície. Té una arrel, i cada node pare pot contenir fills. La Scene es construeix a partir de l’arrel, i el Stage mostra la Scene.
L’arrel ha de ser un node capaç de tenir fills. Hi ha dues famílies:
Group: un contenidor sense comportament propi. No col·loca els fills ni els redimensiona: cadascun es dibuixa a les coordenades que tingui. Serveix per a dibuix i per agrupar figures que s’han de transformar juntes.Region: la base dels contenidors que col·loquen els fills segons una política, i dels controls. ElsPaneen són subclasses, i és el que faràs servir gairebé sempre.
StackPane arrel = new StackPane();
arrel.getChildren().add(new Label("Hello!"));
Scene scene = new Scene(arrel, 400, 200);
primaryStage.setScene(scene);
getChildren() retorna una ObservableList: quan hi afegeixes o en treus un node, la interfície es refresca sola. No cal repintar res.
Layouts
Un layout és una Region que decideix on van els seus fills i què passa quan la finestra canvia de mida. Triar el layout adequat estalvia gairebé tot el càlcul de posicions.
| Layout | Col·loca els fills |
|---|---|
HBox, VBox | En una fila o en una columna |
StackPane | Apilats un damunt de l’altre, centrats |
BorderPane | En cinc zones: dalt, baix, esquerra, dreta i centre |
GridPane | En una graella de files i columnes |
FlowPane, TilePane | Un darrere l’altre, saltant de línia quan cal |
AnchorPane | Ancorats a distàncies fixes de les vores |
Pane | Enlloc: posicions absolutes que has de donar tu |
Els layouts s’aniuen, i és així com es construeix una pantalla real: un BorderPane general, amb una HBox de botons a baix i un GridPane de camps al centre.
VBox arrel = new VBox(10); // 10 px entre fills
arrel.setPadding(new Insets(20));
arrel.getChildren().addAll(
new Label("Nom:"),
new TextField(),
new Button("Desa"));
Dues propietats que resolen la major part dels problemes de col·locació:
spacingipadding: separació entre fills i marge interior del contenidor.Priority.ALWAYS: marca quin fill s’ha de fer gran quan sobra espai, ambHBox.setHgrow(node, Priority.ALWAYS)o l’equivalent vertical.