Як запустити додатки Java, збільшені до розміру на високоекранному дисплеї?


75

Я намагаюся запустити додаток Java (файл JAR) на дисплеї високої DPI в Windows 10. Додаток використовує Swing і, таким чином, не знає DPI. Зазвичай, коли я запускаю програму, яка не відома DPI, Windows буде масштабувати її для мене, хоч і розмитою. Але чомусь це не масштабування програми Java; Я просто дістаю крихітне віконце в кутку з неможливим для читання текстом. Як запустити додаток Java з масштабним масштабуванням (розмитим) режимом Windows?


Це ваша програма і чи контролюєте ви джерела / об’єкти, чи це застаріла програма, яка зараз не змінюється?
harrymc

3
Це не моя заява; відсутність контролю над джерелом.
Jeff E

Погана новина, вам може знадобитися знизити DPI, щоб запустити цю програму. Ось деякі ресурси з хаками, які можуть допомогти: Виправити розмиті шрифти в Windows 10 , Налаштування DPI в Windows 10 , Windows 10 DPI розмито . Створіть принаймні резервну копію точки відновлення системи, перш ніж випробувати їх, про всяк випадок. Резервним рішенням може бути повернення до Windows 7.
harrymc

5
@harrymc Як би допомогло будь-яке з перерахованих вище? Проблема не розмиті шрифти або те, що вона відмовляється запускатись, проблема полягає в тому, що все крихітно . Я хочу досягти "розмитого" відображення шрифту , і, як я зрозумів питання ОП, вони теж роблять. Встановлення масштабування DPI на 100% зробить всю систему крихітною; Якщо встановити роздільну здатність дисплея на неродній, все зробить розмитим. (Гаразд, не розмиття, ніж на екрані 1080p, але все ж.)
millimoose

1
@harrymc І хоча останній може зробити додаток корисним, я впевнений, що ви розумієте, чому відповідати "як я змушу X працювати на дисплеї 2160p?" з "використовувати гірший дисплей" є свого роду пропуском точки.
мільйон

Відповіді:


37

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

-Dsun.java2d.dpiaware=false

[EDIT: На жаль, цей прапор більше не працює в Java 8, я тестував його на Java 6. Схоже, це відома проблема .]

[EDIT 2: Ви можете змінити установку Java 8, щоб вона працювала правильно, використовуючи програму для зміни маніфестів EXE. Я змінив налаштування з true на false на маніфести всередині java.exe та javaw.exe, і тепер мої програми Swing правильно масштабуються у Windows 10 високий dpi. Для цього я використовував Resource Tuner .]

[Редагувати 3] Просто використовуйте Java 9


Чи можете ви детальніше зупинитися на редагуванні №2? Яку настройку ви точно змінили в маніфесті?
Томалак

У Manifest XML це прапор <dpiAware> під <asmv3: application> <asmv3: windowsSettings>
CarlG

В тім-то й річ. Я бачив цей прапор і встановив його false, але додаток (JNLP / WebStart) не змінює масштаб належним чином. Чи можете ви придумати простий спосіб перехресної перевірки, чи працює це чи ні, наприклад, тестовий додаток, який ви знаєте, що відповідає цьому налаштуванню?
Томалак

Веб-старт особливо вибагливий, тому що може бути важко точно визначити, який саме виконуваний файл, у якому встановленому дистрибутиві jre ви в кінцевому підсумку використовуєте. У якості перехресної перевірки я спробую запустити ваш додаток безпосередньо за допомогою java.exe або javaw.exe і пропустити JWS, щоб побачити, чи є різниця.
CarlG

4
Це десь між комічним та далекоглядним. Рамка неправильно повідомляє про свої можливості, а комутатор, який виправив помилку, видаляється. Єдина обробка? Для кінцевих користувачів можна придбати сторонній інструмент. І люди задаються питанням, чому у Java така погана репутація.
Основні

68

Щойно я знайшов просте рішення на моїй машині Windows 10:

  1. Знайдіть java.exeвстановленого.
  2. Клацніть правою кнопкою миші -> Properties
  3. Перейдіть на Compatibilityвкладку
  4. Перевірка Override high DPI scaling behavior.
  5. Виберіть SystemдляScaling performed by:

5
Найкраще рішення - у мене була ця проблема із запуском файлу .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

14

Якщо ви натрапили на це питання, але насправді шукаєте рішення, яке працює в 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, яка перекриває метод фарби () на повноекранному екрані JPanel в системі W10 з екраном 4K та налаштуваннями масштабу 200%. Запустивши за допомогою java.exe Java 8, об’єкт Graphics2D, наданий методу, має масштаб 1, а JPanel має ширину / висоту 3840x2160. Запустіть Java-9 на 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", встановлені на "Система", в адміністративній панелі повноважень (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 вручну в діалоговому вікні властивостей> сумісності файлів java * .exe.


2

Вам потрібно встановити PreferExternalManifest в regedit та створити власні маніфести для java.exe та javaw.exe, як зазначено в наступній відповіді stackoverflow https://stackoverflow.com/a/39372897


3
Хороша новина, оновлення Fall Creators дозволяє змінити поведінку масштабування, клацнувши правою кнопкою миші на елементі, вибравши властивості та потім вкладку сумісності. Створення спеціального зовнішнього маніфесту більше не потрібно - що приємно.
Річард

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


-2

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

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

2
Ласкаво просимо до Супер Користувача! Будь ласка, не додайте у відповідь "дякую" чи "цей працював на мене". Вкладіть деякий час у сайт, і ви отримаєте достатньо привілеїв, щоб одержати відповіді, які вам подобаються, це спосіб Super User сказати дякую.
bertieb

Це може бути коментарем до чужої відповіді. Щоб виправити, необхідно застосувати параметри сумісності з java.exeі / або javaw.exeабо використовувати інші рекомендації. javapathПапка містить посилання на останні Java виконуваних файлів , встановлених в системі. Таким чином, застосування параметрів у програмі Program Filesповинно бути достатньо.
Олексій Іванов

-4

Я зміг отримати розумний dpi при запуску за допомогою командного рядка на зразок:

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

Це дійсно не відповідає на питання, і це не змінює жодних параметрів High DPI java.exeабо javaw.exe.
Олексій Іванов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.