2012-11-12 11 views
12

Gibt es eine Möglichkeit, die Länge einer Zeichenfolge in Pixeln zu berechnen, wenn ein bestimmtes Objekt java.awt.Font verwendet wird, das keine GUI-Komponenten verwendet?Stringlänge in Pixel in Java

+0

Ist das für AWT Font? – Link19

+0

Siehe auch [diese Antwort] (http://stackoverflow.com/questions/6295084/cut-out-image-in-shape-of-text/6296381#6296381) für die Verwendung eines 'GlyphVector'. Es legt das endgültige Bild in eine GUI, aber das ist nur um es anzuzeigen. –

Antwort

10

das keine GUI-Komponenten verwendet?

Es hängt davon ab, was Sie hier bedeuten. Ich nehme an, du meinst, du willst es tun, ohne eine HeadlessException zu erhalten.

Der beste Weg ist mit einem BufferedImage. AFAIK, wird dies nicht werfen ein HeadlessException:

Font font = ... ; 
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); 
FontMetrics fm = img.getGraphics().getFontMetrics(font); 
int width = fm.stringWidth("Your string"); 

Anders als so etwas wie dieses verwenden, ich glaube nicht, Sie können. Sie benötigen einen Grafikkontext, um eine FontMetrics zu erstellen und Ihnen Schriftgrößeninformationen zu geben.

3

Sie können das Graphics2D Objekt die Schrift Grenzen (einschließlich der Breite) erhalten:

Graphics2D g2d = ... 
Font font = ... 
Rectangle2D f = font.getStringBounds("hello world!", g2d.getFontRenderContext()); 

Aber das hängt davon ab, wie Sie das Graphics2D Objekt erhalten werden (zum Beispiel von einem Image).

+0

Ich gehe davon aus, dass das als GUI-Komponente zählt. – Link19

+0

@GlenLamb Ich bin anderer Meinung, 'Image's sind keine GUI-Komponenten. – dacwe

+0

Ich stimme zu, aber die spezifische Notwendigkeit, es ohne GUI-Komponenten zu tun würde im Allgemeinen awt implizieren, sonst macht die Anforderung wenig Sinn. – Link19

2

Dies ergibt die Ausgabe von (137.0, 15.09375) für mich. Ich habe keine Ahnung, was die Einheiten sind, aber es sieht sicherlich proportional korrekt aus und verwendet Graphics2D nicht direkt.

Font f = new Font("Ariel", Font.PLAIN, 12); 
    Rectangle2D r = f.getStringBounds("Hello World! Hello World!", new FontRenderContext(null, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT, RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT)); 
    System.out.println("(" + r.getWidth() + ", " + r.getHeight() + ")");