Как запустить приложения 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


Можете ли вы рассказать о редактировании № 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:

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.


2

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


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, используя этот метод.


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.