Рассчитать ширину отображения строки в Java - PullRequest
78 голосов
/ 03 ноября 2008

Как рассчитать длину (в пикселях) строки в Java?

Предпочтительнее без использования Swing.

EDIT: Я хотел бы нарисовать строку с помощью drawString () в Java2D и используйте длину для переноса слов.

Ответы [ 4 ]

119 голосов
/ 03 ноября 2008

Если вы просто хотите использовать AWT, то используйте Graphics.getFontMetrics (опционально указав шрифт для нестандартного), чтобы получить FontMetrics, а затем FontMetrics.stringWidth чтобы найти ширину для указанной строки.

Например, если у вас есть переменная Graphics с именем g, вы должны использовать:

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

Что касается других наборов инструментов, вам необходимо предоставить нам больше информации - она ​​всегда будет зависеть от набора инструментов.

49 голосов
/ 12 февраля 2013

Это не всегда должно зависеть от инструментария или не всегда нужно использовать подход FontMetrics, так как он требует сначала получить графический объект, который отсутствует в веб-контейнере или в среде без заголовка.

Я проверил это в веб-сервлете, и он вычисляет ширину текста.

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

Добавьте необходимые значения к этим измерениям, чтобы создать любое необходимое поле.

7 голосов
/ 26 августа 2013

Используйте метод 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();
  }

}
0 голосов
/ 25 мая 2017

Я лично искал что-то, чтобы позволить мне вычислить область многострочной строки, чтобы я мог определить, достаточно ли заданная область для печати строки - с сохранением определенного шрифта.

Я надеюсь, что это будет безопасно для другого парня, который, возможно, захочет сделать подобную работу в 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;
}
...