web-dev-qa-db-ja.com

Javaで文字列の表示幅を計算する

Javaで文字列の長さ(ピクセル単位)を計算する方法は?

Swingを使用しないでください。

編集:Java2DのdrawString()を使用して文字列を描画し、Wordのラッピングに長さを使用したいと思います。

78
eflles

AWTのみを使用する場合は、 Graphics.getFontMetrics (デフォルトではないフォントの場合はオプションでフォントを指定)FontMetricsを取得してから FontMetrics.stringWidth 指定した文字列の幅を検索します。

たとえば、Graphicsというg変数がある場合は、次を使用します。

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

他のツールキットについては、さらに情報を提供する必要があります-常にツールキットに依存します。

119
Jon Skeet

常にツールキットに依存する必要はありません。または、Webコンテナまたはヘッドレス環境にないグラフィックオブジェクトを最初に取得する必要があるため、必ずしもFontMetricsアプローチを使用する必要はありません。

これをWebサーブレットでテストしましたが、テキスト幅を計算します。

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

これらの寸法に必要な値を追加して、必要なマージンを作成します。

49
Olofu Mark

次のクラスでgetWidthメソッドを使用します。

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

}
7
Ed Poor

私は個人的に複数行の文字列領域を計算できるものを探していたので、特定のフォントを保持しながら、特定の領域が文字列を印刷するのに十分な大きさであるかどうかを判断できました。

Javaで同様の仕事をしたいと思うかもしれないので、解決策を共有したかっただけの別の人にとってはいつかは安全だと思います。

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;
}
1
wmioduszewski