@ 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
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:
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
110
label = new JLabel("A label");
label.setFont(new Font("Serif", Font.PLAIN, 14));
Ich wollte nur darauf hinweisen, dass die akzeptierte Antwort einige Einschränkungen aufweist (die ich entdeckt habe, als ich versucht habe, sie zu verwenden).
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);
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.
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.
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 desFontMetrics
Objekts einnimmt , und ermittelt anhand dieser Informationen die größte Schriftgröße, die verwendet werden kann, ohne dass der Text aus dem Objekt überläuftJLabel
.Der obige Code kann in die
paint
Methode eingefügt werden, dieJFrame
die enthältJLabel
, 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 )
quelle
label.getHeight()
indirekt dokumentiert wird, dass Pixeleinheiten verwendet werden, währendfont.getSize()
ein Wert in Punkteinheiten zurückgegeben wird. KönntecomponentHeight
eine Verwendung erforderlich sein,label.getHeight() * PPI / dpi
damitMath.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
quelle
JLabel textLabel = new JLabel("<html><span style='font-size:20px'>"+Text+"</span></html>");
quelle
Quellcode für Etikett - Ändern von Farbe und Schriftart (in Netbeans)
jLabel1.setFont(new Font("Serif", Font.BOLD, 12)); jLabel1.setForeground(Color.GREEN);
quelle
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 / modifiziertLayoutManager
) 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 eslabelFont.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, entdeckteJPanel
ich formal die Einschränkung. DerFontMetrics.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.
quelle
JLabel label = new JLabel("Hello World"); label.setFont(new Font("Calibri", Font.BOLD, 20));
quelle