Perché GridPane di JavaFX collega le proprietà del layout ai componenti?

2

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:

  1. 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.
  2. 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ì.
  3. 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.
posta john01dav 24.04.2016 - 08:32
fonte

1 risposta

1

Per quanto riguarda il punto 2: i vincoli sono memorizzati nel nodo che si aggiunge al GridPane. Ogni Nodo (e ogni oggetto visibile nel grafico della scena discende dal Nodo), ha una HashMap chiamata "proprietà".

Gli sviluppatori di applicazioni possono inserire dati arbitrari se lo desiderano, ma ogni classe di layout definisce anche alcune proprietà che vengono utilizzate per controllare il layout. Quindi quando metti un nodo in una GridPane, se vuoi che si estenda su più colonne, puoi impostare la proprietà "gridpane-column-span" sul nodo, con il valore appropriato.

Concettualmente, la penso un po 'come i CSS. Si aggiunge una classe CSS a un nodo e ciò influisce sul suo stile e layout in base a dove viene inserito nel grafico di scena (o flusso di documenti, per HTML). Allo stesso modo, aggiungi un vincolo di layout a un nodo e il componente di layout che inserisci il nodo interpreta quei vincoli quando stende i suoi nodi figli.

In realtà mi piace molto il modello utilizzato da JavaFX: qualsiasi nodo arbitrario può contenere qualsiasi vincolo di layout arbitrario. Spetta al componente di layout interpretarli. Ciò significa che è possibile creare i propri componenti di layout per eseguire layout personalizzati e, se necessario, creare i propri vincoli di layout personalizzati e funzioneranno tutti correttamente con qualsiasi nodo esistente.

Sul punto 3: BorderPane è diverso in quanto ci sono 5 "zone" esplicitamente in cui è possibile posizionare i nodi. Quindi immagino che gli abbiano fornito un'API "corretta" per comodità.

    
risposta data 25.01.2017 - 10:18
fonte

Leggi altre domande sui tag