Я использую класс java.awt.font.TextLayout для измерения границ текстовой строки. В этом измерении мне нужно включить любые конечные пробелы. Однако кажется, что по умолчанию TextLayout игнорирует любые конечные пробелы при вычислении границ текста. Вот пример:
import java.awt.geom.*;
import java.awt.font.*;
import java.text.*;
public class scratch
{
public static double measureTextWidth(String text)
{
AttributedString astring = new AttributedString(text);
AffineTransform at = new AffineTransform();
FontRenderContext frc = new FontRenderContext(at, true, true);
TextLayout layout = new TextLayout(astring.getIterator(), frc);
return layout.getBounds().getWidth();
}
public static void main(String args[])
{
System.out.println(measureTextWidth("sometext"));
System.out.println(measureTextWidth("sometext "));
}
}
Этот код возвращает одинаковую ширину для обеих строк, игнорируя конечные пробелы для второй строки.
Есть ли способ заставить TextLayout учитывать конечные пробелы при вычислении ширины предоставленной текстовой строки?
... чтобы измерить границы текстовой строки — возможно, вы можете просто использовать класс FontMetrics. См.: stackoverflow.com/a/36669350/131872 показывает разницу в границах при использовании FontMetrics и TextLayout. Просто измените текст в примере, чтобы в конце были пробелы.
К сожалению, я не могу использовать FontMetrics, поскольку он используется для строк с атрибутами. Но ведь должен быть способ взаимодействия TextLayout?




Layout.getBounds() возвращает ограничивающую рамку вокруг фактического содержимого, поэтому он не только не включает конечные пробелы, но также не включает ведущие пробелы и даже не включает пустое пространство в фактическую графику символов первого и последнего непробельный символ, по крайней мере, пока вы игнорируете значение x в поле.
Хуже того, в документации написано:
Из-за эффектов растеризации эти границы могут не охватывать все пиксели, отображаемые TextLayout.
Скорее всего, вам нужно получить продвижение от TextLayout, поэтому замените layout.getBounds().getWidth() на Layout.getAdvance().
Да, getAdvance — это именно то, что мне нужно. Спасибо!
Я отредактировал заголовок и тело, чтобы уточнить, о чем спрашивают.