Comment faire pour centrer/wrap/tronquer le Texte pour l'adapter à l'intérieur d'un Rectangle en JavaFX 2.1?
J'ai besoin de créer dynamiquement des Rectangles sur Volet en JavaFX 2.1. Ensuite, je dois center/wrap/tronquer du Texte sur le Rectangle. Le texte a pour s'adapter à l'intérieur du rectangle. Je suis capable de centre et envelopper le texte avec le code suivant, cependant, si la longueur du texte est trop long, il apparaît en dehors du rectangle. Je veux créer le comportement comme l'Étiquette à l'intérieur StackPane, essentiellement si le Rectangle augmente, le Texte va grandir avec elle, mais reste toujours dans le centre du Rectangle et si le Texte ne tient pas dans le Rectangle, il sera tronqué en conséquence.
Rectangle r;
Text t;
...
//center and wrap text within rectangle
t.wrappingWidthProperty().bind(rect.widthProperty().multiply(0.9);
t.xProperty().bind(rect.xProperty().add(rect.widthProperty().subtract(t.boundsInLocalProperty().getValue().getWidth().divide(2)));
t.yProperty().bind(rect.yProperty().add(rect.heightProperty().divide(2)));
t.setTextAlignment(TextAlignment.CENTER);
t.setTextOrigin(VPos.CENTER);
Les propriétés que puis-je utiliser pour atteindre ce ou est-il une meilleure manière de faire ceci?
- Pourquoi ne pas simplement utiliser une Étiquette avec une couleur d'arrière-plan?
Vous devez vous connecter pour publier un commentaire.
Voici un exemple d'une autre implémentation.
Il utilise une sous-classe de
Group
avec unlayoutChildren
mise en œuvre plutôt que de la liaison api.De l'échantillon de sortie de l'exemple d'application:
Un couple de notes:
Il est généralement préférable d'utiliser un
Label
plutôt que d'essayer de recréer une partie de l'Étiquette de la fonctionnalité.La mise en page dans
layoutChildren
approche est similaire à celle utilisée par le JavaFX équipe dans la mise en œuvre en Charge le contrôle de la bibliothèque. Il y a probablement des raisons pour lesquelles ils utilisentlayoutChildren
plutôt que contraignant pour la mise en page, mais je ne suis pas au courant de ce que l'ensemble de ces raisons sont.Je trouve que pour de simples mises en page, à l'aide de la pré-construit des contrôles et des gestionnaires de disposition de la JavaFX bibliothèque est le meilleur (par exemple, la commande ci-dessus pourrait avoir été mis en œuvre en utilisant juste une Étiquette ou un Texte dans StackPane). Où je ne peux pas tout à fait obtenir la mise en page j'ai besoin de l'intégré dans les mises en page, alors je vais compléter leur utilisation avec les liaisons, que je trouve également très facile de travailler avec. Je ne cours pas dans le besoin d'utiliser
layoutChildren
que beaucoup. C'est probablement juste une question de mise à l'échelle de définir des complexes de groupes de nœuds - les plus susceptibles de faire les calculs dans lelayoutChildren
méthode fonctionne mieux et peut-être plus facile de travailler avec et de débogage lorsqu'il est appliqué à des complexes de groupes de nœuds.Plutôt que de tronquer
Text
par le calcul de la taille du texte et eliding caractères supplémentaires à partir d'unString
comme unLabel
n', le code à la place des appelssetClip
sur le nœud de texte visuellement clip pour le rectangle de la taille. Si au contraire vous souhaitez tronquerText
plus comme unLabel
, alors vous pouvez regarder le code pour le JavaFX classe utilitaire qui fait le calcul de la zone de texte.L'exemple de code dans la question ne compile pas car il manque un support sur le
wrappingWidthProperty
expression et il utilisegetValue
etgetWidth
méthodes à l'intérieur d'un bind expression, qui n'est pas possible - à la place, il a besoin d'utiliser un listener sur leboundsInLocalProperty
.Aussi, créé un petit exemple d'application faire des démonstrations de l'ajout de texte est placé dans une Étiquette avec un fond rectangulaire à un Volet avec un contrôle précis de la position x,y de l'étiquette rectangle via la liaison.