web-dev-qa-db-fra.com

Comment changer la taille de la police d'un JLabel pour prendre la taille maximale

J'ai un JLabel dans un conteneur. La taille par défaut de la police est très petite. Je voudrais que le texte du JLabel prenne la taille maximale.

Comment puis je faire ça?

63
g123k

Ce n'est pas le plus beau code, mais ce qui suit choisira une taille de police appropriée pour un JLabel appelé label, de sorte que le texte à l'intérieur s'adapte autant que possible à l'intérieur sans faire 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));

Fondamentalement, le code examine l'espace occupé par le texte JLabel à l'aide de l'objet FontMetrics , puis utilise cet objet. informations pour déterminer la plus grande taille de police pouvant être utilisée sans faire déborder le texte de JLabel.

Le code ci-dessus peut être inséré dans la méthode Paint de JFrame qui contient le JLabel, ou dans une méthode qui sera invoquée lorsque la taille de la police doit être modifiée.

Ce qui suit est une capture d'écran du code ci-dessus en action:

alt text
(source: coobird.net )

69
coobird
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));

tiré de Comment utiliser HTML dans les composants Swing

107
Asaf David
 JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");
9
Ehsan Jelodar

Code source pour étiquette - Comment changer la couleur et la police (dans Netbeans)

jLabel1.setFont(new Font("Serif", Font.BOLD, 12));


jLabel1.setForeground(Color.GREEN);
3
Bekim Fetaji

Je voulais juste souligner que la réponse acceptée comporte quelques limitations (que j'ai découvertes en essayant de l'utiliser)

  1. Comme écrit, il continue de recalculer la taille de la police en se basant sur un rapport de la taille de la police précédente ... donc après seulement quelques appels, la taille de la police a été rendue beaucoup trop volumineuse. (Par exemple, commencez avec 12 points en tant que police DESIGNED, développez l’étiquette de 1 pixel seulement et le code publié calculera la taille de la police comme suit: 12 * (par exemple) 1,2 (rapport espace-champ/texte) = police de 14,4 ou 14 points. 1 pixel de plus et appelez et vous êtes à 16 points!).

Il ne convient donc pas (sans adaptation) à une utilisation dans un contexte d’appel répété (par exemple, un ComponentResizedListener ou un LayoutManager personnalisé/modifié).

Le code répertorié suppose effectivement une taille de départ de 10 points, mais fait référence à la taille de police actuelle et convient donc à un appel unique (pour définir la taille de la police lors de la création de l'étiquette). Cela fonctionnerait mieux dans un environnement à appels multiples s'il faisait int newFontSize = (int) (widthRatio * 10); plutôt que int newFontSize = (int)(labelFont.getSize() * widthRatio);

  1. Comme il utilise new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse)) pour générer la nouvelle police, les polices en gras, italique, couleur, etc. ne sont pas prises en charge par la police d'origine dans la police mise à jour. Ce serait plus flexible si elle utilisait plutôt labelFont.deriveFont.

  2. La solution ne prend pas en charge le libellé HTML. (Je sais que ce n'était probablement pas le résultat escompté du code de réponse proposé, mais comme j'avais un texte HTML JLabel sur mon JPanel, j'ai découvert formellement la limitation. La fonction FontMetrics.stringWidth() calcule la longueur du texte en tant que inclus de la largeur des balises html - c’est-à-dire simplement plus de texte)

Je recommande de regarder la réponse à this SO question ) où la réponse de trashgod pointe vers 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.

1
Warren K