2015-10-18 16:43:09 +0000 2015-10-18 16:43:09 +0000
81
81
Advertisement

Jak uruchamiać aplikacje Java w wysokiej rozdzielczości na ekranie o wysokim DPI?

Advertisement

Próbuję uruchomić aplikację Java (plik JAR) na wyświetlaczu o wysokim DPI w systemie Windows 10. Aplikacja używa Swinga i dlatego nie jest świadoma DPI. Normalnie, gdy uruchamiam aplikację, która nie jest DPI-aware, system Windows skaluje ją dla mnie, aczkolwiek niewyraźnie. Ale z jakiegoś powodu nie skaluje aplikacji Java; dostaję tylko małe okienko w rogu z niemożliwym do odczytania tekstem. Jak mogę uruchomić aplikację Java z wysokim DPI (rozmytym) skalowaniem systemu Windows?

Advertisement

Odpowiedzi (10)

77
77
77
2017-05-10 18:10:25 +0000

Właśnie znalazłem łatwe rozwiązanie na mojej maszynie z systemem Windows 10:

  1. Znajdź java.exe, który zainstalowałeś.
  2. Kliknij prawym przyciskiem myszy - Properties
  3. Przejdź do zakładki Compatibility
  4. Zaznacz Override high DPI scaling behavior.
  5. Wybierz System dla Scaling performed by:.
38
38
38
2015-12-01 18:31:58 +0000

Wydaje się, że problem polega na tym, że Swing domyślnie twierdzi, że jest świadomy DPI, więc windows nie skaluje go. Użyj tego przełącznika, aby wyłączyć to zachowanie, a windows zacznie skalować twoją aplikację swingową:

-Dsun.java2d.dpiaware=false

[ EDIT: Niestety, ta flaga nie wydaje się już działać w Javie 8, testowałem ją w Javie 6. Wygląda na to, że jest to znany problem ]. [ EDIT 2: Możesz zmodyfikować instalację Javy 8, aby działała poprawnie, używając programu do modyfikacji manifestów EXE. Zmieniłem ustawienie z true na false w manifestach wewnątrz java.exe i javaw.exe, i teraz moje programy Swing skalują się poprawnie w Windows 10 high dpi. Użyłem do tego Resource Tuner ].

[Edit 3] Po prostu użyj Java 9

15
Advertisement
15
15
2017-04-02 09:11:49 +0000

Jeśli natknąłeś się na to pytanie, ale faktycznie szukasz rozwiązania, które działa na Linuksie, to jest dla ciebie.

Jeśli możesz dodać parametry do binarnego java, który uruchamia aplikację, możesz użyć opcji -D, aby przekazać wartość dla właściwości sun.java2d.uiScale, aby określić współczynnik skalowania dla Java2D. Spowoduje to przeskalowanie twojej aplikacji. Wartość współczynnika skalowania jest podwójna. Upewnij się, że przekazujesz tę opcję do samego binarnego java, a nie do uruchomionej aplikacji Java.

Przykład: Uruchom NearInfinity.jar ze współczynnikiem skalowania UI równym 2,5

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

Znalazłem ten artykuł całkiem przydatny ogólnie do uruchamiania Linuksa na systemach HiDPI, a niektóre z rzeczy mogą działać również w Windows: https://wiki.archlinux.org/index.php/HiDPI

11
11
11
2017-08-01 00:05:58 +0000

Rozwiązanie: Uruchom go na JRE 9.

Jest to spowodowane tym, że Java runtime deklarowała się jako “DPI-aware”, ale tak naprawdę nie wspierała tego dla AWT i Swing. Aplikacje Java były wymiarowane i renderowane w oparciu o piksele, zamiast być prawidłowo skalowane, co obejmowało wyświetlacze HiDPI. Tak czy inaczej, zostało to niedawno rozwiązane. Zobacz wydanie JEP 263: HiDPI Graphics on Windows and Linux oraz upgrade .

Tak więc, zwiększenie rozmiaru czcionki nie działa (ponieważ nie zwiększa reszty rzeczy); argument jvm -Dsun.java2d.dpiaware=false nie działa (ponieważ nie jest naprawdę obsługiwany); a plik manifestu + edycja rejestru (dla Windows) po prostu nie działa.

Następnie, Musisz uruchomić go na JRE 9, ponieważ naprawdę obsługuje tę funkcję.

4
Advertisement
4
4
2017-12-13 12:08:20 +0000

Aby wymusić na wszystkich plikach wykonywalnych java, aby “właściwości > zgodność > tryb skalowania dpi” były ustawione na “System”, w powershell administratora (win-x, a), uruchom:

$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}

aby cofnąć:

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

Zamiast HKCU można użyć HKLM, ale wtedy nie można już ręcznie zmienić ustawienia skalowania dpi w oknie dialogowym właściwości > kompatybilności plików java.exe.

2
2
2
2017-01-08 17:29:02 +0000

Musisz ustawić PreferExternalManifest w regedit i utworzyć niestandardowe manifesty dla java.exe i javaw.exe, jak podano w następującym stackoverflow answe https://stackoverflow.com/a/39372897

0
Advertisement
0
0
2018-07-07 21:40:12 +0000

Spróbuj Java 10.

Znalazłem, że -Dsun.java2d.dpiaware=false nie działa w Javie 9 lub 10. Również dla Javy 8 i 9 moja aplikacja swingowa jest mała, ale Java 10 ma prawidłowe rozmiary w oknach!

więc dla aplikacji, którą można uruchomić z pliku bat, jak: java -jar xxx.jar

Po prostu dodałem JAVA_HOME=….\java_10 i PATH=%JAVA_HOME%\bin;%PATH% w pliku bat.

java -jar xxx.jar

0
0
0
2018-02-04 04:21:52 +0000

Rozwiązanie Elderry'ego jest dobre, ale co jeśli chcesz uruchomić plik jar w systemie Windows i nie ma on opcji zgodności?

Przejdź do C:\Program Files (x86)\Java i znajdź javaw.exe. Kliknij prawym przyciskiem myszy, właściwości, zakładka kompatybilność, zaznacz “override high DPI scaling behavior” i wybierz “System” (Zauważ, że “System enhanced” nie zadziałało dla mnie).

Teraz okna plików jar powinny skalować się poprawnie z czytelnym tekstem. Jeśli tak nie jest, może to oznaczać, że Windows nie łączy plików typu jar z javaw.eve tak jak powinien. Poprawka od strony trzeciej jest dostępna pod adresem: https://johann.loefflmann.net/en/software/jarfix/index.html

-2
Advertisement
-2
-2
2018-11-30 15:06:18 +0000

Próbowałem większości z tych rozwiązań, ale tym, które zadziałało dla mnie było ustawienie trybu zgodności systemu na plikach, które znalazłem w następującej lokalizacji:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath
```.
-4
-4
-4
2016-08-03 22:14:50 +0000

Byłem w stanie uzyskać sensowne dpi, gdy uruchomiony przy użyciu wiersza poleceń jak:

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