Attualmente sto imparando JavaFX e mi sono imbattuto in un'API molto strana per disporre i componenti della GUI. Forse è meglio spiegato da questo è javadoc :
To use the GridPane, an application needs to set the layout constraints on the children and add those children to the gridpane instance. Constraints are set on the children using static setter methods on the GridPane class:
GridPane gridpane = new GridPane(); // Set one constraint at a time... // Places the button at the first row and second column Button button = new Button(); GridPane.setRowIndex(button, 0); GridPane.setColumnIndex(button, 1); // or convenience methods set more than one constraint at once... Label label = new Label(); GridPane.setConstraints(label, 2, 0); // column=2 row=0 // don't forget to add children to gridpane gridpane.getChildren().addAll(button, label);
Applications may also use convenience methods which combine the steps of setting the constraints and adding the children:
GridPane gridpane = new GridPane(); gridpane.add(new Button(), 1, 0); // column=1 row=0 gridpane.add(new Label(), 2, 0); // column=2 row=0
Mi chiedo quale sia lo scopo di dare i dati di layout in un modo così strano (cioè il primo insieme di metodi) piuttosto che offrire solo i "metodi di convenienza che combinano i passaggi".
Questo sembra strano per diversi motivi:
- Swing, l'unica altra libreria della GUI che conosco in dettaglio ha tutto passato come parte del suo metodo add () nel suo GridBagLayout che sembra essere approssimativamente equivalente a GridPane.
- Non è ovvio in quale oggetto il metodo GridPane.setConstraints () stia effettivamente memorizzando i suoi dati. Dubito che sia nell'oggetto componente reale in quanto non avrebbe molto senso per ogni componente avere variabili membro per un layout che può o non può essere in uso in un dato momento e il metodo non ha alcun riferimento al GridPane specifico in uso in modo che non possa aggiungerlo neanche lì.
- Altri layout JavaFX hanno qualcosa di molto più simile a ciò che mi sembra logico, dando dati di layout al riquadro di layout nel metodo add, con BorderPane I metodi setCenter (), setLeft (), ecc.