J'ai un JLabel
dans un conteneur. La taille par défaut de la police est très petite. J'aimerais que le texte de la JLabel
pour prendre la taille maximale.
Comment puis-je faire ça ?
J'ai un JLabel
dans un conteneur. La taille par défaut de la police est très petite. J'aimerais que le texte de la JLabel
pour prendre la taille maximale.
Comment puis-je faire ça ?
Ce n'est pas le code le plus joli, mais ce qui suit permet de choisir une taille de police appropriée pour un texte de type JLabel
appelé label
de manière à ce que le texte qui se trouve à l'intérieur s'adapte autant que possible à l'intérieur sans déborder de l'étiquette :
Font labelFont = label.getFont();
String labelText = label.getText();
int stringWidth = label.getFontMetrics(labelFont).stringWidth(labelText);
int componentWidth = label.getWidth();
// Find out how much the font can grow in width.
double widthRatio = (double)componentWidth / (double)stringWidth;
int newFontSize = (int)(labelFont.getSize() * widthRatio);
int componentHeight = label.getHeight();
// Pick a new font size so it will not be larger than the height of label.
int fontSizeToUse = Math.min(newFontSize, componentHeight);
// Set the label's font size to the newly determined size.
label.setFont(new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse));
En fait, le code examine l'espace disponible dans le texte de l'image. JLabel
prend en utilisant le FontMetrics
et utilise ensuite ces informations pour déterminer la plus grande taille de police qui peut être utilisée sans déborder du texte de l'objet JLabel
.
Le code ci-dessus peut être inséré dans peut-être le paint
de la méthode JFrame
qui détient le JLabel
ou une méthode qui sera invoquée lorsque la taille de la police doit être modifiée.
Voici une capture d'écran du code ci-dessus en action :
(source : <a href="http://coobird.net/img/growing-text.png" rel="noreferrer">coobird.net </a>)
Vous ne pouvez pas vraiment le faire. La police n'existe pas tant que le JLabel, dans ce cas, n'est pas dessiné. Sinon, vous obtiendrez des NPE si vous essayez de le faire dans le mauvais ordre d'initialisation/de redimensionnement/de dessin.
Le code devrait être dans validate(), pas dans paint(), parce que changer la police invalide le composant qui déclenche un appel à paint(), donc swing repeint sans cesse le composant, utilisant beaucoup de cpu.
Notez que label.getHeight()
est indirectement documenté comme utilisant pixel unités tandis que font.getSize()
renvoie une valeur dans point unités. Puissance componentHeight
besoin utiliser label.getHeight() * PPI / dpi
de sorte que Math.min
renvoie des points, et non des pixels, dans les deux cas ?
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
@animatrix30 : votre question n'a pas beaucoup de sens. Voulez-vous que la taille horizontale ou la taille verticale corresponde à la taille de la JLabel (ou les deux) ? Est-ce que cela doit être automatisé : c'est-à-dire que si vous décidez de rendre votre JLabel, disons, plus large, la police doit-elle s'agrandir automatiquement ? Pourquoi voulez-vous faire cela ? C'est une demande peu courante.
0 votes
Que voulez-vous obtenir ? Afficher une grande police ? ou redimensionner la police par taille de composant ?
0 votes
Mon Container n'a qu'un seul élément : le JLabel. Par défaut, le JLabel prend toute la place. Cependant, la taille de la police est très petite. Je voudrais que la taille de la police soit maximale, afin d'avoir le moins de "blanc" possible. J'espère que vous avez compris ce que j'ai essayé d'expliquer :)
0 votes
@WizardOfOdds la police doit-elle s'agrandir automatiquement : Oui exactement ce que je veux. Je fais cela parce que mon application est destinée aux handicapés.
0 votes
La question est parfaitement logique. Je l'utilise ici : stackoverflow.com/a/4437998/11236