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

72

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

Джефф Э
источник
Это ваше приложение и вы управляете источниками / объектами, или это устаревшее приложение, которое теперь нельзя изменить?
harrymc
3
Это не мое заявление; нет контроля над источником.
Джефф Э
Плохая новость: вам может понадобиться уменьшить DPI, чтобы запустить это приложение. Вот некоторые ресурсы с хаки, которые могут помочь: Исправление размытых шрифтов в Windows 10 , Настройки DPI в Windows 10 , Размытие DPI 10 в Windows . На всякий случай создайте, по крайней мере, резервную копию точки восстановления системы. Резервным решением может быть возврат к Windows 7.
harrymc
4
@harrymc Как бы то ни было из перечисленного поможет? Проблема не в расплывчатых шрифтах или в том, что они отказываются запускаться, проблема в том, что все крошечно . «Размытый» рендеринг шрифтов - это то, чего я хочу достичь, и, как я понял вопрос ОП, они тоже этого добиваются. Установка масштабирования DPI на 100% сделает всю систему крошечной; если установить разрешение экрана не нативное, все будет выглядеть размытым. (Ладно, для меня не более размыто, чем на дисплее с разрешением 1080p, но все же.)
mimimoose
1
@harrymc И хотя последнее может сделать приложение пригодным для использования, я уверен, что вы понимаете, почему отвечаете: «Как заставить X работать на дисплее 2160p?» с «использовать худшее отображение» отчасти упускает суть.
миллимус

Ответы:

35

Проблема здесь заключается в том, что 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

CarlG
источник
Можете ли вы рассказать о редактировании № 2? Какую настройку вы точно изменили в манифесте?
Томалак
В XML манифеста это флаг <dpiAware> в разделе <asmv3: application> <asmv3: windowsSettings>
CarlG
В этом-то и дело. Я видел этот флаг и установил его на false, но приложение (JNLP / WebStart) не масштабировалось должным образом в любом случае. Можете ли вы придумать простой способ перепроверить, работает ли это или нет, например, известное вам тестовое приложение, которое реагирует на этот параметр?
Томалак
Webstart особенно привередлив, потому что может быть трудно точно определить, какой исполняемый файл, в котором вы установили jre дистрибутив, вы в конечном итоге используете. В качестве перекрестной проверки я бы попробовал запустить ваше приложение напрямую с помощью java.exe или javaw.exe и пропустить JWS, чтобы увидеть, есть ли разница.
CarlG
4
Это где-то между комичным и фарсом. Фреймворк неверно сообщает о своих возможностях, и переключатель, который исправил ошибку, удаляется. Единственный обходной путь? Для конечных пользователей купить сторонний инструмент. И люди задаются вопросом, почему у Java такая плохая репутация.
Basic
64

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

  1. Найти java.exeвас установлено.
  2. Правый клик -> Properties
  3. Перейти на Compatibilityвкладку
  4. Проверьте Override high DPI scaling behavior.
  5. Выбрать SystemдляScaling performed by:
Elderry
источник
4
Лучшее решение - у меня была проблема с запуском файла .jnlp, поэтому мне пришлось изменить «C: \ Program Files \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe», но это работало как шарм.
Дрор Харари
Для меня это была версия JDK. Найден щелчком правой кнопки мыши и открытием параметров из диспетчера задач в Windows 10.
Брайан Кноблаух
3
Для Windows 10 с запущенными пусковыми установками Minecraft на базе Java мне пришлось изменить все установленные версии Java в моей системе, чтобы она работала (java.exe и javaw.exe).
кибербол
5
Я использовал менее навязчивый вариант. Я создал ярлык для команды java -jar myJarFile.jarи выполнил шаги с 2 по 5 для этого ярлыка (Windows 10, Java 8).
Жюльен Кронегг
1
Для меня это былоjavaw.exe
masterxilo
12

Если вы наткнулись на этот вопрос, но на самом деле ищете решение, которое работает на 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

Кристиан Худжер
источник
Это хорошо, хотя я хотел бы получить масштабирование 1 для JFrames и масштабирование системы для JOptionPanes.
NateS
1
Не работает для меня
Атте Ювонен
@AtteJuvonen Вместо того, чтобы просто сказать «моя машина не работает», когда она не работает для вас, почему бы вам не опубликовать новый вопрос с описанием того, что вы пробовали, каков был ожидаемый результат, каков был фактический В результате, какую командную строку вы использовали и какие сообщения об ошибках вы получили?
Кристиан Худжер
@ChristianHujer Я попытался запустить свое приложение Java Swing с этим параметром (та же командная строка, что и в вашем ответе, за исключением того, что путь к jar отличается), и приложение было запущено без масштабирования.
Атте Ювонен
Извините, если я выгляжу грубым, просто расстроен, когда ничего не работает. FWIW Я опубликовал новый вопрос по этому вопросу, и я также опубликую вознаграждение, как только сайт позволит мне.
Атте Ювонен
10

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

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

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

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

Серхио Мюриэль
источник
Я буду действительно взволнован, если Java9 исправит это.
music2myear
3
Это не указывает на то, что вы должны перекомпилировать код. Простое выполнение одного и того же приложения Java 8 на Java 9+ не изменит поведения
Ramhound
Запуск программ HiDPI на Java 9 решает множество проблем. goo.gl/3zmL7b
Гернот Крост
3
@ Ramhound Вам не нужно перекомпилировать. Я только что построил банку с JDK8 для Java 8, которая переопределяет полноэкранный метод paint () JPanel в системе W10 с экраном 4K и настройкой масштаба 200%. Запустите java.exe из Java 8, объект Graphics2D, данный методу, будет иметь масштаб 1, а JPanel - getWidth / height 3840x2160. Запустите java.exe из Java 9, масштабирование равно 2, а ширина / высота - 1920x1080.
Президент Dreamspace
1
В Java 9 вы найдете новый метод: Screen.getPrimary (). GetOutputScaleX (); который на самом деле работает. (Другой вариант - использовать размер экрана JavaFX, (Screen.getPrimary (). GetVisualBounds ()), который работает, и разделить его на Toolkit.getDefaultToolkit (). GetScreenSize (). Вы обнаружите, что можете получить предположение при выбранном значении DPI: 200% приведет к примерно 2,0, но, к сожалению, 125% все еще приводит к проценту масштабирования 1,0. Однако даже после перехода на Java9: я обнаружил, что все мои графические интерфейсы полностью разрушены при расширении кнопок, но некоторые константы (используется для пробелов, заполнения и т. д.) не.
wax_lyrical
4

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

masterxilo
источник
2

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

droidlabel
источник
2
Хорошая новость: обновление Fall Creators позволяет изменять масштабирование, щелкая правой кнопкой мыши элемент, выбирая свойства, а затем вкладку «Совместимость». Создание собственного внешнего манифеста больше не требуется - и это хорошо.
Ричард
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, используя этот метод.

Xile
источник
0

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

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

Теперь окна файлов 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
Райан Рейнольдс
источник
1
Добро пожаловать в Супер пользователя! Пожалуйста, не добавляйте «спасибо» или «это сработало для меня» в качестве ответов. Потратьте некоторое время на сайт, и вы получите достаточные привилегии, чтобы выслушать ответы, которые вам нравятся, что является суперпользователем, чтобы сказать спасибо.
Bertieb
-3

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

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
user3301455
источник