2016-02-16 46 views
5

Sono confuso sul motivo per cui l'impostazione Label.setAlignment (Pos.CENTER_RIGHT) non influisce sull'allineamento di un'etichetta che viene quindi aggiunta in una GridPane? L'unico modo per farlo è apparentemente attraverso la griglia (ad esempio ColumnConstraints) o ad es. aggiungendo l'etichetta ad un HBox che ha il giusto allineamento.Allineamento JavaFX di Label in GridPane

Perché l'impostazione dell'allineamento dell'etichetta su CENTER_RIGHT non ha alcun effetto? Vedo che l'API dice: "Specifica come il testo e il grafico all'interno dell'etichetta devono essere allineati quando c'è spazio vuoto all'interno dell'etichetta". Ma come posso ottenere uno spazio vuoto in un'etichetta?

risposta

13

TL: versione DR: anziché label.setAlignment(Pos.CENTER_RIGHT); utilizzare GridPane.setHalignment(label, HPos.RIGHT);.

JavaFX utilizza un layout top-down. Quindi la scena dimensiona il nodo radice alla dimensione della scena, le dimensioni del nodo radice e posiziona ciascuno dei suoi nodi figli in base alla sua strategia di layout e alla quantità di spazio che la scena gli ha assegnato, ciascun nodo figlio quindi dimensiona e posiziona i suoi nodi figli. a seconda della propria strategia di layout e della quantità di spazio disponibile, e così via nel grafico della scena.

Secondo la documentazione per Label, il alignmentProperty

Specifica come il testo e grafica all'interno Labelled devono essere allineate quando v'è spazio vuoto all'interno della etichetta.

Ovviamente, la quantità di spazio disponibile per l'etichetta è determinata dal padre, che in questo caso è il riquadro della griglia. Ovviamente è possibile conoscere la strategia di layout del riquadro della griglia e come configurarla leggendo il suo documentation. In breve, tuttavia:

Per impostazione predefinita, un riquadro della griglia alloca ciascun nodo della sua dimensione preferita e, se la cella in cui è inserito ha spazio aggiuntivo, allinea il nodo nella parte superiore sinistra della cella della griglia. La dimensione preferita per un'etichetta è ovviamente la dimensione calcolata: abbastanza grande da contenere il suo contenuto. Di conseguenza, si vede che posizionare semplicemente un'etichetta in un riquadro della griglia e impostare l'allineamento sull'etichetta non avrà alcun effetto, poiché l'etichetta ha una dimensione appena sufficiente a contenere il suo contenuto e non vi è spazio aggiuntivo per allineare il testo/l'immagine. Puoi visualizzarlo posizionando un colore di sfondo o un bordo sull'etichetta.

Quindi è possibile impostare l'allineamento sull'etichetta su CENTER_RIGHT e quindi indicare al riquadro della griglia di far crescere l'etichetta. Questo ha bisogno di due cose: in primo luogo, dire il riquadro della griglia di lasciare l'etichetta riempire la larghezza della cella:

GridPane.setFillWidth(label, true); 

e, dal momento che il riquadro della griglia sarà anche rispettare dimensione massima del nodo figlio, e l'etichetta usa per default sua dimensione preferita come la dimensione massima, permettere l'etichetta di crescere:

label.setMaxWidth(Double.MAX_VALUE); 

Poi l'etichetta crescerà alla dimensione della cella, e quindi se si hanno anche

label.setAlignment(Pos.CENTER_RIGHT); 

allineerà sua proprio co sempre a destra.

Un approccio più ragionevole è probabilmente solo a dire il riquadro della griglia come allineare l'etichetta nella cella:

GridPane.setHalignment(label, HPos.RIGHT); 

Allora l'etichetta assumere le dimensioni e l'allineamento di default e tutto funzionerà.

È inoltre possibile utilizzare un oggetto ColumnConstraints per impostare l'allineamento predefinito per tutte le etichette in una colonna particolare, che è di gran lunga l'approccio più conveniente se si sta costruendo un modulo.

+0

grazie, è un'ottima risposta. – Tranquility

+0

Un punto di nota: trovo sia l'impostazione della larghezza preferita delle etichette su un valore più grande sia l'impostazione della larghezza massima come specificato e quindi l'impostazione di allineamento a destra, si allinea correttamente. In altre parole, la chiamata a setFillWidth non è necessaria? Puoi spiegare ulteriormente perché questo è il caso e quando avrei bisogno di utilizzare effettivamente setFillWidth? – Tranquility

+0

'setFillWidth (true)' significa che il riquadro della griglia ridimensiona il nodo al massimo della larghezza massima o della larghezza della colonna. Se 'setFillWidth' è falso (predefinito) imposterà la larghezza del nodo alla sua larghezza preferita. Si noti tuttavia che la larghezza della colonna è determinata dalla larghezza massima pref di tutto il suo contenuto; quindi aumentando la larghezza pref di un nodo potresti forzare la colonna ad essere più larga di quanto desideri. –