Wie berechnet man die Länge (in Pixel) einer Zeichenfolge in Java?
Am besten ohne Swing.
BEARBEITEN: Ich möchte die Zeichenfolge mit drawString() in Java2D zeichnen und die Länge für den Zeilenumbruch verwenden.
eflen
Wie berechnet man die Länge (in Pixel) einer Zeichenfolge in Java?
Am besten ohne Swing.
BEARBEITEN: Ich möchte die Zeichenfolge mit drawString() in Java2D zeichnen und die Länge für den Zeilenumbruch verwenden.
Jon Skeet
Wenn Sie nur AWT verwenden möchten, verwenden Sie Graphics.getFontMetrics
(optional Angabe der Schriftart, für eine nicht standardmäßige), um a zu erhalten FontMetrics
und dann FontMetrics.stringWidth
um die Breite für die angegebene Zeichenfolge zu finden.
Wenn Sie zum Beispiel eine Graphics
Variable aufgerufen g
, würden Sie verwenden:
int width = g.getFontMetrics().stringWidth(text);
Für andere Toolkits müssen Sie uns weitere Informationen geben – es wird immer vom Toolkit abhängig sein.
Es könnte klarer sein, wenn Sie ein Verwendungsbeispiel angeben. Anfangs habe ich versucht, es als statische Methode zu verwenden, da Sie es so geschrieben haben.
– Äquitas
15. Juli 15 um 23:13 Uhr
Veraltet! aber immer noch die beste Methode!, Warum lehnen sie eine Methode ab, wenn es keinen besseren Weg gibt!!! Ich verstehe es einfach nicht!
– Imann
9. April 17 um 13:16 Uhr
@Zich: Ich bin mir nicht sicher, welche Methode Ihrer Meinung nach veraltet ist – soweit ich sehen kann, ist keine von ihnen in der Java 8-Dokumentation als veraltet markiert …
– Jon Skeet
9. April 17 um 13:20 Uhr
@Zich: Es ist eine Methode in Graphics
, nicht FontMetrics
. Aber du rufst an Toolkit.getFontMetrics
, was in der Tat veraltet ist und worüber diese Methode nicht spricht … Sie müssen bei solchen Dingen wirklich vorsichtig sein, insbesondere bevor Sie anfangen, über das Melden von Fehlern zu sprechen …
– Jon Skeet
9. April 17 um 13:36 Uhr
@Zich: Nun, ich würde nicht raten – ich würde die nicht veraltete Methode oder die nicht veralteten Methoden verwenden Toolkit.getFontMetrics
schlägt stattdessen vor.
– Jon Skeet
9. April 17 um 13:43 Uhr
Olofu Mark
Es muss nicht immer Toolkit-abhängig sein oder man muss nicht immer den FontMetrics-Ansatz verwenden, da man zuerst ein Grafikobjekt erhalten muss, das in einem Web-Container oder in einer Headless-Umgebung fehlt.
Ich habe dies in einem Web-Servlet getestet und es berechnet die Textbreite.
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.geom.AffineTransform;
...
String text = "Hello World";
AffineTransform affinetransform = new AffineTransform();
FontRenderContext frc = new FontRenderContext(affinetransform,true,true);
Font font = new Font("Tahoma", Font.PLAIN, 12);
int textwidth = (int)(font.getStringBounds(text, frc).getWidth());
int textheight = (int)(font.getStringBounds(text, frc).getHeight());
Fügen Sie diesen Dimensionen die erforderlichen Werte hinzu, um einen erforderlichen Spielraum zu erstellen.
Ich glaube nicht, dass das Erstellen einer affineTransform und eines fontRenderContext auf diese Weise zu einem guten Verhalten führen wird. Ich denke, font.getTransfrom() wäre logischer.
– Adrian Gorrell
7. März 13 um 15:13 Uhr
Ihr Beispiel verwendet immer noch die AWT-Funktionalität. Mit SWT Font zum Beispiel wird es nicht funktionieren, deshalb “wird es immer Toolkit-abhängig sein”
– serg.nechaev
18. September 13 um 3:57 Uhr
@Olofu Mark – getStringBounds gibt nur die logischen Grenzen an. Um es besser zu machen, sollte es getBounds() und das LineMetrics-Objekt verwenden, um die tatsächliche Höhe einschließlich Aufstieg und Abstieg abzurufen.
– Jones
14. Oktober 13 um 7:57 Uhr
Verwenden Sie die getWidth-Methode in der folgenden Klasse:
import java.awt.*;
import java.awt.geom.*;
import java.awt.font.*;
class StringMetrics {
Font font;
FontRenderContext context;
public StringMetrics(Graphics2D g2) {
font = g2.getFont();
context = g2.getFontRenderContext();
}
Rectangle2D getBounds(String message) {
return font.getStringBounds(message, context);
}
double getWidth(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getWidth();
}
double getHeight(String message) {
Rectangle2D bounds = getBounds(message);
return bounds.getHeight();
}
}
Und jetzt zu etwas vollständig unterschiedlich. Das Folgende geht von einer Arial-Schriftart aus und macht eine wilde Vermutung basierend auf einer linearen Interpolation von Zeichen vs. Breite.
// Returns the size in PICA of the string, given space is 200 and 'W' is 1000.
// see https://p2p.wrox.com/access/32197-calculate-character-widths.html
static int picaSize(String s)
{
// the following characters are sorted by width in Arial font
String lookup = " .:,;'^`!|jl/\i-()JfIt[]?{}sr*a"ce_gFzLxkP+0123456789<=>~qvy$SbduEphonTBCXY#VRKZN%GUAHD@OQ&wmMW";
int result = 0;
for (int i = 0; i < s.length(); ++i)
{
int c = lookup.indexOf(s.charAt(i));
result += (c < 0 ? 60 : c) * 7 + 200;
}
return result;
}
Interessant, aber vielleicht nicht sehr praktisch.
wmioduszewski
Ich persönlich habe nach etwas gesucht, mit dem ich den Bereich der mehrzeiligen Zeichenfolge berechnen kann, damit ich feststellen kann, ob der angegebene Bereich groß genug ist, um die Zeichenfolge zu drucken – unter Beibehaltung einer bestimmten Schriftart.
private static Hashtable hash = new Hashtable();
private Font font;
private LineBreakMeasurer lineBreakMeasurer;
private int start, end;
public PixelLengthCheck(Font font) {
this.font = font;
}
public boolean tryIfStringFits(String textToMeasure, Dimension areaToFit) {
AttributedString attributedString = new AttributedString(textToMeasure, hash);
attributedString.addAttribute(TextAttribute.FONT, font);
AttributedCharacterIterator attributedCharacterIterator =
attributedString.getIterator();
start = attributedCharacterIterator.getBeginIndex();
end = attributedCharacterIterator.getEndIndex();
lineBreakMeasurer = new LineBreakMeasurer(attributedCharacterIterator,
new FontRenderContext(null, false, false));
float width = (float) areaToFit.width;
float height = 0;
lineBreakMeasurer.setPosition(start);
while (lineBreakMeasurer.getPosition() < end) {
TextLayout textLayout = lineBreakMeasurer.nextLayout(width);
height += textLayout.getAscent();
height += textLayout.getDescent() + textLayout.getLeading();
}
boolean res = height <= areaToFit.getHeight();
return res;
}
.
Ohne Schaukel? Welches Gerät verwenden Sie? Welche Schriftart? Welche Größe? Welcher Stil? All diese Dinge ändern die Anzeigebreite.
– S. Lott
3. November 08 um 12:31 Uhr
Wie willst du die Schnur ziehen? Mit AWT? Oder mit einem anderen Toolkit? Die Größe des Strings in Pixeln hängt von der Zeichnungs-API ab, die später den Pixel zeichnet (und natürlich, welche Schriftart Sie verwenden und welche Schriftgröße und ob die Schriftart fett/kursiv ist usw.). Ohne die Zeichnungs-API und die Schriftarteigenschaften zu kennen, hat eine Zeichenfolge keinerlei Größe.
– Mecki
3. November 08 um 12:33 Uhr
@S. Lott. Du hast es in einem. Ich war versucht, dies als Nichtfrage zu schließen.
– David Arno
3. November 08 um 12:34 Uhr
@David Arno: Ich bin ein Softie auf dem n00bz. Ich werde die hinzufügen [beginner] Schild.
– S. Lott
3. November 08 um 12:39 Uhr
Als .NET-Äquivalent gibt es die TextRenderer-Klasse, siehe stackoverflow.com/questions/604298/…
– Sprich
22. September 2009 um 9:01 Uhr