So ändern Sie die Schriftgröße eines JLabels, um die maximale Größe zu erreichen

73

Ich habe einen JLabelin einem Container. Die Standardgröße der Schrift ist sehr klein. Ich möchte, dass der Text der JLabeldie maximale Größe annimmt.

Wie kann ich das machen?

g123k
quelle
1
@ animatrix30: deine frage macht wenig sinnvoll. Möchten Sie, dass die horizontale oder vertikale Größe mit der Größe des JLabels (oder beiden) übereinstimmt? Muss dies automatisiert werden: Wenn Sie sich entscheiden, Ihr JLabel beispielsweise breiter zu machen, sollte die Schriftart dann automatisch wachsen? Warum willst du das machen? Es ist eine ungewöhnliche Anfrage.
SyntaxT3rr0r
Was möchten Sie erreichen? eine große Schrift zeigen? oder die Schriftgröße pro Komponentengröße ändern?
Ringträger
Mein Container Juste hat ein Element: das JLabel. Durch Defaut nehmen die Jlabel den ganzen Platz ein. Die Schriftgröße ist jedoch sehr klein. Ich möchte, dass die Schriftgröße maximal ist, um möglichst wenig "Weiß" zu haben. @ring Träger Ich möchte den größtmöglichen FOnt für dieses Jlabel haben Ich hoffe, Sie haben verstanden, was ich versucht habe zu erklären :)
g123k
@WizardOfOdds sollte die Schrift automatisch wachsen: Ja genau das, was ich will. Ich mache das, weil meine Bewerbung für Behinderte ist
g123k
Die Frage macht durchaus Sinn. Ich benutze es hier: stackoverflow.com/a/4437998/11236
ripper234

Antworten:

78

Nicht der schönste Code, aber im Folgenden wird eine geeignete Schriftgröße für einen JLabelaufgerufenen Code ausgewählt, labelsodass 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 JLabelmithilfe des FontMetricsObjekts 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 paintMethode eingefügt werden, die JFramedie 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:

Alt-Text
(Quelle: coobird.net )

Coobird
quelle
Das kann man nicht wirklich machen. Die Schriftart existiert erst, wenn das JLabel in diesem Fall zum ersten Mal gezeichnet wird. Andernfalls erhalten Sie NPEs, wenn Sie versuchen, dies in der falschen Reihenfolge der Initialisierung / Größenänderung / Zeichnung zu tun.
Searchengine27
Der Code sollte in validate () und nicht in paint () sein, da durch Ändern der Schriftart die Komponente ungültig wird, die einen Aufruf von paint () auslöst. Swing malt die Komponente also endlos neu und verwendet viel CPU.
Vouze
Beachten Sie, dass label.getHeight()indirekt dokumentiert wird, dass Pixeleinheiten verwendet werden, während font.getSize()ein Wert in Punkteinheiten zurückgegeben wird. Könnte componentHeighteine Verwendung erforderlich sein, label.getHeight() * PPI / dpidamit Math.minin beiden Fällen Punkte und keine Pixel zurückgegeben werden?
Dave Jarvis
10
 JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");
Ehsan Jelodar
quelle
3

Quellcode für Etikett - Ändern von Farbe und Schriftart (in Netbeans)

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


jLabel1.setForeground(Color.GREEN);
Bekim Fetaji
quelle
Falemnderit @Bekim Fetaji
Marin
1

Ich wollte nur darauf hinweisen, dass die akzeptierte Antwort einige Einschränkungen aufweist (die ich entdeckt habe, als ich versucht habe, sie zu verwenden).

  1. Wie geschrieben, wird die Schriftgröße basierend auf einem Verhältnis zur vorherigen Schriftgröße immer wieder neu berechnet. Nach nur wenigen Aufrufen wurde die Schriftgröße daher viel zu groß. (Beispiel: Beginnen Sie mit 12 Punkten als DESIGNED-Schriftart, erweitern Sie die Beschriftung um nur 1 Pixel, und der veröffentlichte Code berechnet die Schriftgröße als 12 * (sagen wir) 1,2 (Verhältnis von Feldraum zu Text) = 14,4 oder 14 Punkt. 1 Pixel mehr und anrufen und du bist bei 16 Punkt!).

Es ist daher nicht (ohne Anpassung) für die Verwendung in einer Einstellung für wiederholte Anrufe (z. B. a ComponentResizedListeneroder 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);

  1. 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.deriveFontstattdessen verwendet würde.

  2. 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 JLabelauf meinem hatte, entdeckte JPanelich 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.

Warren K.
quelle
1
JLabel label = new JLabel("Hello World");
label.setFont(new Font("Calibri", Font.BOLD, 20));
ataullahtoffar
quelle
1
Von Code-Antworten wird abgeraten. Es ist großartig, wenn Sie eine Beschreibung hinzufügen, wie das Problem dadurch gelöst wird.
Saeed Foroughi