67

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

11 ответов11

55

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

  1. Найдите java.exe вы установили.
  2. Щелкните правой кнопкой мыши -> Properties
  3. Перейти на вкладку « Compatibility »
  4. Установите Override high DPI scaling behavior.
  5. Выберите System для Scaling performed by:
33

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

-Dsun.java2d.dpiaware=false

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

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

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

11

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

Если вы можете добавить параметры в двоичный файл java который запускает приложение, вы можете использовать опцию -D чтобы передать значение для sun.java2d.uiScale 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

9

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

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

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

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

2

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

2

Чтобы заставить все исполняемые файлы 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.

2

Спасибо за Кеннета. Я нахожу 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, используя этот метод.

0

Решение 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.

0

Попробуйте 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

-1

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

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

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

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .