Поддержка JavaFX 8 HiDPI

Я только что опробовал пример Hello World на JavaFX на экране 4k в Arch Linux, но, к сожалению, графический интерфейс не масштабируется.

В документации сказано

Привет-DPI поддержка. JavaFX 8 теперь поддерживает дисплеи Hi-DPI.

Итак, как я могу сделать так, чтобы мое приложение знало dpi?

1 ответ

Решение

Поддержка Hi-DPI на различных устройствах

Для Mac OS X с дисплеем Retina он должен "просто работать" - JavaFX знает о Mac с Hi-DPI и будет соответствующим образом масштабировать пользовательский интерфейс. Если вы установите интервал в VBox на 8, то это будет устройство, независимое от устройства; на дисплее Mac, не поддерживающем сетчатку, он будет занимать 8 пикселей, на дисплее с двойным разрешением - 16 пикселей. Поскольку дисплей сетчатки также имеет в два раза больше DPI, а также удвоенное разрешение дисплея без сетчатки, физическое измерение пространства на экране будет одинаковым независимо от устройства.

Для устройств Windows и Linux ваши результаты могут быть менее удовлетворительными, так как JavaFX 8u20 в настоящее время по умолчанию не определяет произвольные разрешения DPI на таких устройствах и масштабируется до них соответствующим образом. То, что вы могли бы сделать, это выполнить большинство ваших измерений в css в единицах em (которые основаны на размере точки шрифта по умолчанию для корня сцены) и аналогично для fxml, а затем соответственно установить размер точки шрифта по умолчанию для корня сцены в зависимости от что вы определяете из запроса разрешения экрана DPI. См. Обсуждение в этом ответе для получения дополнительной информации и примера кода: автоматическое изменение размера javafx и заполнение кнопок.

Специфично для Гнома

У Gnome 3 есть настройка для коэффициента масштабирования, которым можно управлять с помощью этой команды:

gsettings set org.gnome.desktop.interface scaling-factor 2

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

Просто личный анекдот - когда я пытался использовать масштабирование Gnome 3 (CentOS 7, а также недавний выпуск Fedora) на дисплее Hi-DPI пару дней назад, я обнаружил, что общая поддержка Hi-DPI в приложениях, работающих под Linux, была довольно пятнистый Конечно, поддержка была значительно улучшена по сравнению с CentOS 6, когда я пытался это сделать, но для достижения качественной поддержки Hi-DPI можно было бы использовать качественную поддержку оконного инструментария, стандартных приложений и сторонних приложений. По этой причине я считаю, что запуск настольных компьютеров HiDPI Gnome по-прежнему является весьма инновационным, и это определенно не для всех - я уверен, что со временем ситуация изменится.

Растровые изображения

От ведущего блога команды JavaFX на Hi-DPI:

В приложениях Apple (начиная с iPhone и iPad с их дисплеями Retina) решение проблемы заключается в том, что разработчик приложения должен предоставить два изображения вместо одного для каждого актива изображения. Например, на заставке будут два изображения: одно с нормальным разрешением и одно с 2-кратным разрешением. Файлы называются одинаково, но 2x называется по некоторому соглашению, так что во время выполнения платформа будет искать версию 2x на сетчатке за кулисами. Таким образом, ваше приложение говорит "fooImage.png", но вместо "fooImage@2x.png" выполняется поиск на компьютере с дисплеем сетчатки.

Я не знаю, есть ли эта функция выбора растрового изображения для дисплеев Hi-DPI в настоящее время в Java 8u20 или нет - вам, возможно, придется реализовать ее самостоятельно, запросив экран с помощью screen.getDpi (), а затем загрузив соответствующее растровое изображение.

4K устройства

4K - много пикселей для нажатия. JavaFX по умолчанию будет использовать аппаратный ускоренный графический конвейер, если такой графический конвейер доступен. Некоторое графическое оборудование может быть не полностью оптимизировано для отображения 4K (например, не хватает видеопамяти), что может привести к тому, что приложение не будет работать или работает плохо. Я также не верю, что в настоящее время много усилий было уделено исследованию производительности JavaFX на различных устройствах 4K - это может "просто работать", но может и не работать. Вам нужно будет протестировать ваше приложение на целевом оборудовании, чтобы определить текущие возможности приложений JavaFX при работе на этом оборудовании. Вам также может понадобиться настроить приложение в соответствии с некоторыми из приведенных выше предложений.

Пользователь сообщил о проблеме с JavaFX 8u20 при попытке отобразить видео 4K с помощью JavaFX:

Фон

Поддержка Hi-DPI в OS X была (вероятно) проще, чем устройства Windows/Linux, так как целевые устройства - это дисплей сетчатки или не сетчатки, одно из которых является точным 2-кратным масштабом другого, и можно использовать прямую поддержку со стороны системы OS X чтобы помочь достичь масштабирования сетчатки. В Windows/Linux, вероятно, требуется умение масштабировать с факторами, отличными от двухкратных, и это покрывается запросом функции (в настоящее время ожидаемым и запланированным) RT-32521 Поддержка глобального масштабирования координат с настройкой по умолчанию на основе DPI. Масштабирование на целую величину обычно дает наилучшие видимые результаты.

Дополнительные ресурсы

Полное руководство по кодированию для устройств Hi-DPI выходит за рамки этого конкретного ответа - вы можете получить доступ к различным веб-ресурсам для получения дополнительной информации.

Если у вас есть дополнительные вопросы по поддержке Hi-DPI для JavaFX, я предлагаю вам задать их в списке рассылки для разработчиков openjfx-dev JavaFX.

Wiki Ответ

Этот ответ может иметь некоторые возможные несоответствия или ошибки и может встречаться со временем. Я сделал ответ сообществу вики. Если вам известны конкретные исправления, ограничения для устройств и ОС или поддержка модели Hi-DPI для JavaFX, смело редактируйте этот ответ или перемещайте его в вики OpenJFX (где он, вероятно, в любом случае принадлежит).

Я столкнулся с той же проблемой. Я создал приложение javaFX на моем Surface Pro 3, которое не масштабировалось, но приложения fxml масштабировались. затем я установил jre8u221, не заменяя предложенную обновленную версию. Это устранило проблему

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