Как принудительно сгладить сглаживание в шрифтах JavaFX?

#fonts #javafx #antialiasing

#шрифты #javafx #сглаживание

Вопрос:

Во время тестирования графического интерфейса моего приложения JavaFX 8 я заметил, что некоторые метки не отображают сглаженный текст. После некоторого поиска в Google и борьбы я обнаружил, что происходит очень неприятная вещь. Сглаживание применяется только к ярлыкам, размер шрифта которых превышает 80 пикселей. Вот пример сравнения приложений JavaFX и Swing с применением AA:

введите описание изображения здесь

Пример кода: https://gist.github.com/anonymous/be60bb89181376ff12aa

Есть ли способ принудительно использовать AA во всех размерах шрифта? С вами тоже такое случается? Я искал аналогичную ошибку в JavaFX Jira, но пока никто на это не жалуется. Может быть, мне следует открыть его для этого?

Некоторая информация, которая может помочь:

 java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
Windows 8.1 64 bits [Version 6.3.9600]
  

Комментарии:

1. Для этого я открыл ошибку в Jira .

Ответ №1:

По умолчанию JavaFX 8 использует modena.css для настройки сглаживания ЖК-дисплея, что, похоже, в некоторых случаях не сглаживает шрифты. Когда размер шрифта превышает 80 пикселей, метод AA переключается на серый масштаб AA (по соображениям производительности). Итак, для достижения плавных краев любого размера вместо этого следует использовать шкалу серого цвета AA.

Это можно сделать либо с помощью JavaFX CSS:

 .text{
    -fx-font-smoothing-type: gray;
}
  

Или системные аргументы:

 -Dprism.lcdtext=false
  

Или настройка системных свойств (перед загрузкой FXML):

 System.setProperty("prism.lcdtext", "false");
  

Спасибо всем, кто ответил на Jira!

Комментарии:

1. Я думаю, что тип сглаживания текста по умолчанию — «серый» (см. docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html ), но Modena CSS установил для него значение «lcd».

2. Стоит отметить, что если пользовательский интерфейс загружен из шаблона FXML, System.setProperty("prism.lcdtext", "false"); перед его загрузкой следует вызвать, иначе это не даст никакого эффекта.

Ответ №2:

System.setProperty("prism.lcdtext", "false");

Должен вызываться перед загрузкой шаблона FXML