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?
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:
(source: coobird.net )
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 pour é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 limitations (que j'ai découvertes en essayant de l'utiliser)
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);
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
.
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.