Вычислите ширину отображения строки в Java

StackOverflow https://stackoverflow.com/questions/258486

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Для других наборов инструментов вам нужно будет предоставить нам больше информации - это всегда будет зависеть от набора инструментов.

Другие советы

Это не всегда должно зависеть от инструментария или не всегда нужно использовать подход 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());

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

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

}

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

Я надеюсь, что это сэкономит некоторое время другому парню, который, возможно, захочет выполнить аналогичную работу на 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top