Масштабирование Java Swing HiDPI

Я создал программу с использованием Java 8, которая использует графический интерфейс Swing в Eclipse IDE. Чтобы масштабировать изображения и значки до соответствующих размеров, он получает и использует разрешение экрана. После компиляции программы в Eclipse программа отображается отлично, и кажется, что все работает как надо. Однако, когда я экспортирую проект как «Runnable Jar» и запускаю программу, масштабирование изображения и внешний вид программы отключаются.

При дальнейшем расследовании выяснилось, что runnable jar возвращал разрешение экрана, которое ровно в 2,5 раза меньше, чем в eclipse (фактическое разрешение — 3840x2160 против 1536x864). В Интернете есть косвенные доказательства того, что Java 8 Look and Feels (или что-то в этом роде) не поддерживает масштабирование экрана HiDPI. Существуют разбросанные решения, которые утверждают, что решают проблему, например, обновление до версий Java после 8 или добавление аргументов в компиляцию jar (что бы это ни значило). Это уже сбивает с толку новичка в Java, и еще больше сбивает с толку то, что программа отлично отображается при запуске/компиляции в Eclipse IDE.

Мой вопрос: знает ли кто-нибудь, как заставить программу, скомпилированную на Java, использовать Swing для правильного масштабирования на экране HiDPI, и какой процесс мне нужно выполнить, чтобы скомпилировать работающую программу?

РЕДАКТИРОВАТЬ 1: Интересно отметить, что в моих настройках Windows «Масштаб и макет», «Изменить размер текста, приложений и других элементов» установлено ровно 250%, а это означает, что этот параметр, очевидно, является причиной проблемы масштабирования, с которыми я сталкиваюсь. Кто-нибудь знает, как обойти этот параметр внутри программы или почему он работает, когда я запускаю его через Eclipse?

Какие параметры использует eclipse в конфигурации запуска?

Thorbjørn Ravn Andersen 16.06.2019 12:48

По моему опыту, первой версией Java, которая правильно обрабатывает экраны HiDPI, является Java 12. Попробуйте запустить (не нужно компилировать) ваше приложение с Java 12 и посмотрите, улучшит ли это ситуацию.

a_horse_with_no_name 16.06.2019 12:55

Насколько я могу судить, Eclipse не использует никаких параметров (аргументов?) при запуске программы @ThorbjørnRavnAndersen

Matthew Brian 16.06.2019 12:56

@a_horse_with_no_name По какой-то причине удаление всех других версий java из моей системы и вместо этого использование Java 12 немного сработало. Внезапно разрешение текста на экране начало корректно масштабироваться до нужного размера, но проблема с неправильным разрешением экрана осталась.

Matthew Brian 16.06.2019 13:19

Что такое Запустить конфигурацию в Затмение для запуска вашей программы? В меню Затмение выберите Бегать > Запустить конфигурации....

Abra 16.06.2019 13:40

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

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

Ответы 1

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

Java 8 не поддерживает высокий DPI. В Windows он работает в режиме без учета DPI и полагается на то, что Windows растягивает растровое изображение окна до масштаба, установленного для монитора в настройках. Это означает, что пользовательский интерфейс приложения выглядит размытым при отображении на мониторе с высоким разрешением.

Более поздние версии Java, Java 11 и выше, поддерживают настройки High DPI для каждого монитора. Пользовательский интерфейс вашего приложения правильно масштабируется в соответствии с настройками, текст остается четким. Чтобы значки и изображения оставались четкими, следует использовать MultiResolutionImage или его базовую реализацию BaseMultiResolutionImage для обеспечения альтернатив с более высоким разрешением.

Вы не должны основывать свои изображения на разрешении экрана, а скорее на масштабе, установленном для монитора. Например, монитор Full HD 1920×1080 с масштабом 150% имеет эффективное разрешение 1280×720, это эффективное разрешение, которое вам сообщает Java.

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