Comment modifier la taille de la police d'un JLabel pour prendre la taille maximale
j'ai un JLabel
dans un conteneur.
La taille de défaut de la police est très petite.
Je voudrais que le texte du JLabel
prenne la taille maximale.
Comment faire?
5 réponses
pas le code le plus joli, mais le suivant choisira une taille de police appropriée pour un JLabel
appelé label
tel que le texte à l'intérieur s'adaptera autant que possible à l'intérieur sans déborder 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));
essentiellement, le code regarde combien d'espace le texte dans le JLabel
prend en utilisant le FontMetrics
, et utilise ensuite cette information pour déterminer la plus grande taille de police qui peut être utilisée sans déborder le texte du JLabel
.
le code ci-dessus peut être inséré dans la méthode paint
du JFrame
qui contient le JLabel
, ou une méthode qui sera invoquée lorsque la taille de la police doit être changée.
ce qui suit est une capture d'écran du code ci-dessus en action:
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));
JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");
Code Source de l'Étiquette - Comment changer la Couleur et la Police (dans Netbeans)
jLabel1.setFont(new Font("Serif", Font.BOLD, 12));
jLabel1.setForeground(Color.GREEN);
je voulais juste souligner que la réponse acceptée comporte quelques limites (que j'ai découvertes en essayant de l'utiliser)
- tel qu'il est écrit, il tient en fait recalculer la taille de la police basé sur un rapport de la précédent taille de la police... ainsi, après seulement quelques appels, la taille de la police est devenue beaucoup trop grande. (par exemple, commencez avec 12 points comme votre police conçue, augmentez l'étiquette de seulement 1 pixel, et le code publié calculera la taille de la police comme 12 * (say) 1.2 (rapport de l'espace de champ au texte) = 14.4 ou 14 points de police. 1 Pixel de plus et appel et vous êtes à 16 point !).
il n'est donc pas adapté (sans adaptation) pour une utilisation dans un réglage d'appel répété (par exemple un ComponentResizedListener
, ou un personnalisé/modifié LayoutManager
).
le code indiqué suppose effectivement une taille de départ de 10 pt mais se réfère à la taille de police actuelle et est ainsi, convient pour appeler une fois (pour définir la taille de la police lors de l'étiquette est créée). Elle fonctionnerait mieux dans un environnement à appels multiples si elle faisait int newFontSize = (int) (widthRatio * 10);
plutôt que int newFontSize = (int)(labelFont.getSize() * widthRatio);
-
parce qu'il utilise
new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse))
pour générer la nouvelle police, il n'y a pas de support pour le gras, italique ou couleur etc à partir de la police originale dans la police mise à jour. Il serait plus souple d'utiliserlabelFont.deriveFont
à la place. -
La solution ne fournit pas de support pour HTML le Texte de l'étiquette. (Je sais que ce n'était probablement jamais un résultat prévu du code de réponse offert, mais comme j'avais un texte HTML
JLabel
sur monJPanel
j'ai découvert officiellement la limitation. LeFontMetrics.stringWidth()
calcule la longueur du texte comme inclusive de la largeur des balises html - c'est à dire comme simplement plus de texte)
je recommande d'examiner la réponse à cette SO question où la réponse de trashgod pointe à un certain nombre de réponses différentes (y compris celle-ci) à une question presque identique. Sur cette page, je vais fournir une réponse supplémentaire qui accélère l'une des autres réponses par un facteur de 30-100.