Как включить конечный пробел в размеры текста с помощью TextLayout?

Я использую класс 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 учитывать конечные пробелы при вычислении ширины предоставленной текстовой строки?

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

Grodriguez 30.05.2024 18:48

... чтобы измерить границы текстовой строки — возможно, вы можете просто использовать класс FontMetrics. См.: stackoverflow.com/a/36669350/131872 показывает разницу в границах при использовании FontMetrics и TextLayout. Просто измените текст в примере, чтобы в конце были пробелы.

camickr 31.05.2024 03:04

К сожалению, я не могу использовать FontMetrics, поскольку он используется для строк с атрибутами. Но ведь должен быть способ взаимодействия TextLayout?

Grodriguez 31.05.2024 09:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Layout.getBounds() возвращает ограничивающую рамку вокруг фактического содержимого, поэтому он не только не включает конечные пробелы, но также не включает ведущие пробелы и даже не включает пустое пространство в фактическую графику символов первого и последнего непробельный символ, по крайней мере, пока вы игнорируете значение x в поле.

Хуже того, в документации написано:

Из-за эффектов растеризации эти границы могут не охватывать все пиксели, отображаемые TextLayout.

Скорее всего, вам нужно получить продвижение от TextLayout, поэтому замените layout.getBounds().getWidth() на Layout.getAdvance().

Да, getAdvance — это именно то, что мне нужно. Спасибо!

Grodriguez 10.06.2024 16:42

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