Я создал программу с использованием 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?
По моему опыту, первой версией Java, которая правильно обрабатывает экраны HiDPI, является Java 12. Попробуйте запустить (не нужно компилировать) ваше приложение с Java 12 и посмотрите, улучшит ли это ситуацию.
Насколько я могу судить, Eclipse не использует никаких параметров (аргументов?) при запуске программы @ThorbjørnRavnAndersen
@a_horse_with_no_name По какой-то причине удаление всех других версий java из моей системы и вместо этого использование Java 12 немного сработало. Внезапно разрешение текста на экране начало корректно масштабироваться до нужного размера, но проблема с неправильным разрешением экрана осталась.
Что такое Запустить конфигурацию в Затмение для запуска вашей программы? В меню Затмение выберите Бегать > Запустить конфигурации....
Если вы масштабируете дисплей HiDPI, вы получаете меньшее эффективное разрешение - я думаю, этого и следовало ожидать.




Java 8 не поддерживает высокий DPI. В Windows он работает в режиме без учета DPI и полагается на то, что Windows растягивает растровое изображение окна до масштаба, установленного для монитора в настройках. Это означает, что пользовательский интерфейс приложения выглядит размытым при отображении на мониторе с высоким разрешением.
Более поздние версии Java, Java 11 и выше, поддерживают настройки High DPI для каждого монитора. Пользовательский интерфейс вашего приложения правильно масштабируется в соответствии с настройками, текст остается четким. Чтобы значки и изображения оставались четкими, следует использовать MultiResolutionImage или его базовую реализацию BaseMultiResolutionImage для обеспечения альтернатив с более высоким разрешением.
Вы не должны основывать свои изображения на разрешении экрана, а скорее на масштабе, установленном для монитора. Например, монитор Full HD 1920×1080 с масштабом 150% имеет эффективное разрешение 1280×720, это эффективное разрешение, которое вам сообщает Java.
Какие параметры использует eclipse в конфигурации запуска?