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.
grazie, è un'ottima risposta. – Tranquility
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
'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. –