Java: при использовании производного шрифта размер шрифта не изменяется - PullRequest
0 голосов
/ 18 марта 2019

Я загружаю пользовательский шрифт (из файла ttf) в свой проект и использую переменный размер (плавание f) для изменения размера.Тем не менее, размер на самом деле не устанавливается (застрял на 1).Вот мой код:

public static void main(String[] args) {
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    try {
        Font mont =
                Font.createFont(
                        Font.TRUETYPE_FONT,
                        new File(System.getProperty("user.dir") + "/data/Montserrat-MediumItalic.ttf"))
                        .deriveFont(20f);
        ge.registerFont(mont);

        Arrays.stream(ge.getAllFonts())
                .filter(font -> font.getFontName().contains("Mont"))
                .forEach(font -> System.out.println(font.getFontName() + ", Size: " + font.getSize()));

    } catch (FontFormatException | IOException e) {
        e.printStackTrace();
    }
}

вывод: Montserrat Medium Italic, Size: 1

примечание: замена font.getSize() на font.getSize2D печать 1.0.

Новое: использование декодирования:

Я сейчас использую это

Font test = Font.decode("Montserrat Medium Italic-ITALIC-20");

(фиксированный класс не загружается)

Обновление 2:

эта строка: Font mont = Font.createFont(Font.ITALIC, new File(System.getProperty("user.dir") + "/data/Montserrat-MediumItalic.ttf")); throws IllegalArgumentException: font format not recognized

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Однако размер на самом деле не устанавливается (застрял на 1).

Это вряд ли так.Я попросил прямого подтверждения в комментарии к вопросу («Что mont.getSize() вернуть?» - упс, что за смущающая плохая грамматика), но пока вы не ответили.Я достаточно уверен, что если вы проверите, вы увидите, что mont.getSize() соответствует размеру, который вы запрашивали.

Альтернативное объяснение вашего наблюдаемого поведения легко доступно.Вы используете GraphicsEnvironment.getAllFonts() для создания отчетов о зарегистрированных шрифтах, но согласно его документации этот метод

возвращает массив, содержащий экземпляр размера в одну точку всех шрифтов, доступных в этой GraphicsEnvironment.

(выделение добавлено.)

Другой ответ и особенно комментарии к нему предполагают, что объекты Font, возвращаемые GraphicsEnvironment.getAllFonts(), могутотличаются и в других отношениях от соответствующих Font экземпляров, переданных в GraphicsEnvironment.registerFont().Хотя, насколько я вижу, такие вариации не документированы, они соответствуют предполагаемому использованию Font объектов, полученных от GE, как описано в getAllFonts() документах:

Типичное использование будетпозволить пользователю выбрать определенный шрифт.Затем приложение может определить размер шрифта и установить различные атрибуты шрифта, вызвав метод diverveFont для выбранного экземпляра.

Они говорят, что

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

Я не уверен, что "несколько программируемых вариантов"означает атрибуты, которые могут быть изменены при извлечении одного Font объекта из другого (тогда какой шрифт не будет иметь программируемые варианты?), но ясно, что getAllFonts() не является механизмом для чтенияверните точные Font объекты, ранее представленные GraphicsEnvironment.registerFont().Эти объекты могут даже не сохраняться как таковые.

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

1 голос
/ 19 марта 2019

Я думаю, я знаю, в чем проблема. Когда вы вызываете ge.registerFont(mont), он делает именно это, он регистрирует базовый шрифт без изменений объекта шрифта. Функция deriveFont() только изменяет состояние текущего объекта шрифта, но не может изменять фактический шрифт. Когда вы регистрируете шрифт, он регистрируется с размером 1. Если вы напечатаете размер всех остальных шрифтов, вы обнаружите, что они также имеют значение по умолчанию 1. Я не думаю, что вы можете зарегистрировать шрифт с пользовательский размер по умолчанию или переопределить размер по умолчанию Font.getFont(). Когда вы получаете шрифт с помощью Font.getFont(), он всегда будет иметь размер по умолчанию 12 (из спецификации ).

Если вам нужен специально отформатированный шрифт, я бы предложил создать статическую переменную класса:

Font MontMediumItalic_20;

Затем загрузите шрифт один раз, либо в загрузчике ресурсов, либо в конструкторе, и примените к нему все модификации.

Также вы можете использовать Font.decode()

Пожалуйста, дайте мне знать, если вам нужна помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...