Как запустить приложения Java, масштабированные на дисплее с высоким разрешением?

Я пытаюсь запустить приложение Java (файл JAR) на дисплее с высоким DPI в Windows 10. Приложение использует Swing и, следовательно, не поддерживает DPI. Обычно, когда я запускаю приложение, которое не поддерживает DPI, Windows масштабирует его для меня, хотя и размыто. Но по какой-то причине это не масштабирует приложение Java; Я просто получаю маленькое окошко в углу с невозможным для чтения текстом. Как запустить приложение Java с масштабированием Windows с высоким разрешением (размытое)?

12 ответов

Решение

Проблема здесь заключается в том, что Swing по умолчанию утверждает, что поддерживает DPI, поэтому Windows не масштабирует его. Используйте этот переключатель, чтобы отключить это поведение, и Windows начнет масштабировать ваше приложение Swing:

-Dsun.java2d.dpiaware=false

[ПРАВКА: К сожалению, этот флаг больше не работает в Java 8, я тестировал его в Java 6. Похоже, это известная проблема.]

[РЕДАКТИРОВАТЬ 2: Вы можете изменить установку Java 8 для правильной работы, используя программу для изменения манифестов EXE. Я изменил настройку с true на false в манифестах внутри java.exe и javaw.exe, и теперь мои программы Swing корректно масштабируются в Windows 10 с высоким разрешением. Я использовал Resource Tuner для этого.]

[Править 3] Просто используйте Java 9

Просто нашел простое решение на моем компьютере с Windows 10:

  1. найти java.exe Вы установили.
  2. Правый клик -> Properties
  3. Идти к Compatibility табуляция
  4. Проверьте Override high DPI scaling behavior.
  5. выберите System за Scaling performed by:

Если вы наткнулись на этот вопрос, но на самом деле ищете решение, которое работает на Linux, это для вас.

Если вы можете добавить параметры в java двоичный файл, который запускает приложение, вы можете использовать опцию -D передать значение для sun.java2d.uiScale Рекомендуется указать коэффициент масштабирования для Java2D. Это будет масштабировать ваше приложение. Значение коэффициента масштабирования является двойным. Убедитесь, что вы передаете эту опцию java сам бинарный, а не запущенное Java-приложение.

Пример: Запустите NearInfinity.jar с коэффициентом масштабирования пользовательского интерфейса 2,5

java -Dsun.java2d.uiScale=2.5 -jar ~/jars/NearInfinity.jar

Я нашел эту статью довольно полезной в целом для запуска Linux в системах HiDPI, и некоторые вещи могут также работать в Windows: https://wiki.archlinux.org/index.php/HiDPI

Решение: Запустите его на JRE 9.

Это связано с тем, что среда выполнения Java объявила себя "DPI-осведомленной", но на самом деле не поддерживала ее для AWT и Swing. Java-приложения были измерены и отображены на основе пикселей, а не должным образом масштабированы, включая дисплеи HiDPI. В любом случае, это было недавно решено. См. Выпуск JEP 263. Графика HiDPI в Windows и Linux и обновление.

Таким образом, увеличение размера шрифта не работает (потому что это не увеличивает все остальное); аргумент JVM -Dsun.java2d.dpiaware=false не работает (потому что это не очень поддерживается); и файл манифеста + редактирование реестра (для Windows) просто не работает.

Затем вам нужно запустить его на JRE 9, потому что он действительно поддерживает эту функцию.

Чтобы заставить все исполняемые файлы Java иметь "свойства> совместимость> режим масштабирования dpi", установленный на "Система", в PowerShell администратора (win-x, a) выполните:

$javaexes = (Get-ChildItem -path "$env:ProgramFiles\Java","${env:ProgramFiles(x86)}\java" -filter java?.exe -recurse  | Where-Object {$_.Name -match "java(|w).exe"} ).fullname

$javaexes | foreach {REG ADD "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"  /V $_ /T REG_SZ /D "~ DPIUNAWARE" /F}

отменить:

$javaexes | foreach {REG delete "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"  /V $_ /f}

Вместо HKCU вы можете использовать HKLM, но тогда вы больше не сможете вручную изменить настройку dpi-scaling в диалоге свойств> совместимости файлов java*.exe.

Вам необходимо установить PreferExternalManifest в regedit и создать собственные манифесты для java.exe и javaw.exe, как указано в следующем ответе stackoverflow https://stackoverflow.com/a/39372897

Спасибо за Кеннета. я нахожу C:\Program Files (x86)\Java\jre\bin\java.exe затем right click -> properties -> compatibility tab -> "override high DPI scaling behavior" и выберите System, тогда это работает. Я также пытался таким же образом изменить javaw.exeСовместимость, это тоже работает.

PS: я бегу burpsuite.jar на win10 1703, используя этот метод.

Попробуйте Java 10.

Я обнаружил, что -Dsun.java2d.dpiaware=false не работает в Java 9 или 10. Кроме того, для Java 8 и 9 мое приложение Swing маленькое, но размеры Java 10 в Windows правильные!

поэтому для приложения, которое вы можете запустить из файла bat, например: java -jar xxx.jar

Я только что добавил JAVA_HOME=....\java_10 и PATH=%JAVA_HOME%\bin;%PATH% в файле bat.

java -jar xxx.jar

Решение Elderry хорошо, но что, если вы хотите запустить jar-файл в Windows, и у него нет параметров совместимости?

Перейдите в C:\Program Files (x86)\Java\jre\bin и найдите javaw.exe. Щелкните правой кнопкой мыши, выберите свойства, вкладку совместимости, установите флажок "Переопределить поведение масштабирования с высоким разрешением" и выберите "Система" (обратите внимание, что "Улучшенная система" не работает для меня).

Теперь окна файлов jar должны правильно масштабироваться с читаемым текстом. В противном случае это может означать, что Windows не связывает файлы типа jar с javaw.eve, как это должно быть. Исправление третьей стороны доступно по адресу: https://johann.loefflmann.net/en/software/jarfix/index.html

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

      export _JAVA_OPTIONS="-Dswing.systemlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel -Dswing.aatext=true -Dawt.useSystemAAFontSettings=on $_JAVA_OPTIONS"

Его также можно применить к одному приложению:

      _JAVA_OPTIONS="-Dswing.systemlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel -Dswing.aatext=true -Dawt.useSystemAAFontSettings=on $_JAVA_OPTIONS" visualvm_216/bin/visualvm

Источник: https://bbs.archlinux.org/viewtopic.php?id=185503#p1445438 .

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

C:\Program Files (x86)\Common Files\Oracle\Java\javapath

Я смог получить ощутимое значение точек на дюйм при запуске с помощью командной строки, например:

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
Другие вопросы по тегам