Frage

Wie die Länge (in Pixel) eines Strings in Java berechnen?

Bevorzugte ohne Schwingen verwendet wird.

EDIT: Ich möchte die Zeichenfolge mit dem drawString () in Java2D ziehen und verwenden Sie die Länge für den Zeilenumbruch.

War es hilfreich?

Lösung

Wenn Sie nur AWT verwenden möchten, dann verwenden Sie Graphics.getFontMetrics (optional die Schriftart Angabe für ein nicht-Standard-one) ein FontMetrics zu bekommen und dann FontMetrics.stringWidth die Breite für die angegebene Zeichenfolge zu finden.

Zum Beispiel, wenn Sie eine Graphics Variable namens g haben, dann würden Sie verwenden:

int width = g.getFontMetrics().stringWidth(text);

Für andere Toolkits, müssen Sie uns mehr Informationen geben -. Es wird immer sein Toolkit abhängig

Andere Tipps

Es muss nicht immer Toolkit abhängig oder sein nicht immer benötigt den Fontmetrics-Ansatz, da es benötigt man zunächst ein Grafik-Objekt zu erhalten, die in einem Web-Containern fehlt oder in einer Headless-Umgebung.

Ich habe dies in einem Web-Servlet getestet und es funktioniert die Textbreite berechnen.

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());

In

die erforderlichen Werte für diese Dimensionen alle erforderlichen Spielraum zu schaffen.

Mit der 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();
  }

}

Ich persönlich war auf der Suche nach etwas, um mich den mehrzeiligen String Bereich zu berechnen, so konnte ich feststellen, ob gegebene Fläche groß genug ist, um die Zeichenfolge zu drucken -. Mit bestimmten Schriftart Erhaltung

Ich hoffe, es würde sicher einige Zeit in einen anderen Typ, der ähnlich Job in Java tun wollen, so wollte nur die Lösung teilen:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top