Ich habe einen JLabel
in einem Container. Die Standardgröße der Schrift ist sehr klein. Ich möchte, dass der Text der JLabel
die maximale Größe annimmt.
Wie kann ich das machen?
Ich habe einen JLabel
in einem Container. Die Standardgröße der Schrift ist sehr klein. Ich möchte, dass der Text der JLabel
die maximale Größe annimmt.
Wie kann ich das machen?
Antworten:
Nicht der schönste Code, aber im Folgenden wird eine geeignete Schriftgröße für einen JLabel
aufgerufenen Code ausgewählt, label
sodass der darin enthaltene Text so gut wie möglich in das Innere passt, ohne dass das Etikett überläuft:
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));
Grundsätzlich prüft der Code, wie viel Platz der Text im Text JLabel
mithilfe des FontMetrics
Objekts einnimmt , und ermittelt anhand dieser Informationen die größte Schriftgröße, die verwendet werden kann, ohne dass der Text aus dem Objekt überläuft JLabel
.
Der obige Code kann in die paint
Methode eingefügt werden, die JFrame
die enthält JLabel
, oder in eine Methode, die aufgerufen wird, wenn die Schriftgröße geändert werden muss.
Das Folgende ist ein Screenshot des obigen Codes in Aktion:
(Quelle: coobird.net )
label.getHeight()
indirekt dokumentiert wird, dass Pixeleinheiten verwendet werden, während font.getSize()
ein Wert in Punkteinheiten zurückgegeben wird. Könnte componentHeight
eine Verwendung erforderlich sein, label.getHeight() * PPI / dpi
damit Math.min
in beiden Fällen Punkte und keine Pixel zurückgegeben werden?
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));
entnommen aus der Verwendung von HTML in Swing-Komponenten
JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");
Quellcode für Etikett - Ändern von Farbe und Schriftart (in Netbeans)
jLabel1.setFont(new Font("Serif", Font.BOLD, 12));
jLabel1.setForeground(Color.GREEN);
Ich wollte nur darauf hinweisen, dass die akzeptierte Antwort einige Einschränkungen aufweist (die ich entdeckt habe, als ich versucht habe, sie zu verwenden).
Es ist daher nicht (ohne Anpassung) für die Verwendung in einer Einstellung für wiederholte Anrufe (z. B. a ComponentResizedListener
oder benutzerdefiniert / modifiziert LayoutManager
) geeignet .
Der aufgelistete Code nimmt effektiv eine Startgröße von 10 pt an, bezieht sich jedoch auf die aktuelle Schriftgröße und eignet sich daher zum einmaligen Aufrufen (um die Schriftgröße beim Erstellen des Etiketts festzulegen). In einer Umgebung mit mehreren Anrufen würde es besser funktionieren, wenn dies nicht der int newFontSize = (int) (widthRatio * 10);
Fall wäreint newFontSize = (int)(labelFont.getSize() * widthRatio);
Da new Font(labelFont.getName(), Font.PLAIN, fontSizeToUse))
die neue Schriftart generiert wird, werden Fettdruck, Kursiv oder Farbe usw. von der Originalschriftart in der aktualisierten Schriftart nicht unterstützt. Es wäre flexibler, wenn es labelFont.deriveFont
stattdessen verwendet würde.
Die Lösung bietet keine Unterstützung für HTML-Label Text. (Ich weiß, dass dies wahrscheinlich nie ein beabsichtigtes Ergebnis des angebotenen Antwortcodes war, aber da ich einen HTML-Text JLabel
auf meinem hatte, entdeckte JPanel
ich formal die Einschränkung. Der FontMetrics.stringWidth()
berechnet die Textlänge einschließlich der Breite der HTML-Tags - dh als einfach mehr Text)
Ich empfehle, die Antwort auf diese SO-Frage zu betrachten, wobei die Antwort von trashgod auf eine Reihe unterschiedlicher Antworten (einschließlich dieser) auf eine fast identische Frage verweist. Auf dieser Seite werde ich eine zusätzliche Antwort bereitstellen, die eine der anderen Antworten um den Faktor 30-100 beschleunigt.
JLabel label = new JLabel("Hello World");
label.setFont(new Font("Calibri", Font.BOLD, 20));