web-dev-qa-db-fra.com

Alignement JavaFX de Label dans GridPane

Je ne comprends pas pourquoi la définition de Label.setAlignment (Pos.CENTER_RIGHT) n'affecte pas l'alignement d'une étiquette qui est ensuite ajoutée dans un GridPane? La seule façon de le faire est apparemment à travers la grille (par exemple ColumnConstraints) ou par par l'ajout de l'étiquette à une HBox alignée à droite.

Pourquoi la définition de l'alignement de l'étiquette sur CENTER_RIGHT est-elle sans effet? Je peux voir que l'API dit: "Spécifie comment le texte et le graphique dans le libellé doivent être alignés lorsqu'il y a un espace vide dans le libellé." Mais comment obtenir un espace vide dans une étiquette?

12
Tranquility

TL: version DR : au lieu de label.setAlignment(Pos.CENTER_RIGHT); utilisez GridPane.setHalignment(label, HPos.RIGHT);.

JavaFX utilise une disposition descendante. Ainsi, la scène dimensionne le nœud racine à la taille de la scène, le nœud racine taille et positionne chacun de ses nœuds enfants en fonction de sa stratégie de disposition et de la quantité d'espace que la scène lui a donnée, chaque nœud enfant dimensionne et positionne ensuite ses nœuds enfants en fonction de sa propre stratégie de mise en page et de la quantité d'espace dont il dispose, et ainsi de suite sur le graphique de la scène.

Selon la documentation de Label , le alignmentProperty

Spécifie la façon dont le texte et le graphique de l'étiquette doivent être alignés lorsqu'il y a un espace vide dans l'étiquette.

Bien sûr, la quantité d'espace disponible pour l'étiquette est déterminée par son parent, qui dans ce cas est le volet de la grille. Vous pouvez bien sûr découvrir la stratégie de mise en page du volet grille et comment le configurer en lisant son documentation . En bref, cependant:

Par défaut, un volet de grille allouera à chaque nœud sa taille préférée et, si la cellule dans laquelle il est placé dispose d'un espace supplémentaire, alignera le nœud en haut à gauche de la cellule de la grille. La taille préférée pour une étiquette est bien sûr la taille calculée: juste assez grande pour contenir son contenu. Par conséquent, vous voyez que le simple fait de placer une étiquette dans un volet de grille et de définir l'alignement sur l'étiquette n'aura aucun effet, car l'étiquette est dimensionnée juste assez grande pour contenir son contenu, et il n'y a pas d'espace supplémentaire pour aligner le texte/graphique. Vous pouvez visualiser cela en plaçant une couleur d'arrière-plan ou une bordure sur l'étiquette.

Vous pouvez donc définir l'alignement de l'étiquette sur CENTER_RIGHT, puis demandez au volet de la grille de laisser l'étiquette s'agrandir. Cela nécessite deux choses: tout d'abord, dites au volet de la grille de laisser l'étiquette remplir la largeur de la cellule:

GridPane.setFillWidth(label, true);

et, puisque le volet de la grille respectera également la taille maximale du nœud enfant et que l'étiquette utilise par défaut sa taille préférée comme taille maximale, autorisez la taille de l'étiquette:

label.setMaxWidth(Double.MAX_VALUE);

Ensuite, l'étiquette atteindra la taille de la cellule, et donc si vous avez également

label.setAlignment(Pos.CENTER_RIGHT);

il alignera son propre contenu vers la droite.

Une approche plus judicieuse consiste probablement simplement à indiquer au volet de la grille comment aligner l'étiquette dans la cellule:

GridPane.setHalignment(label, HPos.RIGHT);

Laissez ensuite l'étiquette prendre sa taille et son alignement par défaut et tout fonctionnera.

Vous pouvez également utiliser un objet ColumnConstraints pour définir l'alignement par défaut de toutes les étiquettes d'une colonne particulière, ce qui est de loin l'approche la plus pratique si vous créez un formulaire.

25
James_D