Jak uruchomić skalowane aplikacje Java na ekranie o wysokiej rozdzielczości?

75

Próbuję uruchomić aplikację Java (plik JAR) na ekranie o wysokiej rozdzielczości w systemie Windows 10. Aplikacja używa Swing, a zatem nie obsługuje DPI. Zwykle po uruchomieniu aplikacji, która nie rozpoznaje DPI, system Windows skaluje ją dla mnie, choć jest rozmazana. Ale z jakiegoś powodu nie skaluje aplikacji Java; Po prostu dostaję małe okienko w rogu z niemożliwym do odczytania tekstem. Jak uruchomić aplikację Java z skalowaniem wysokiej rozdzielczości (rozmycia) systemu Windows?

Jeff E.
źródło
Czy to Twoja aplikacja i czy kontrolujesz źródła / obiekty, czy też jest to starsza aplikacja, która jest teraz niezmienna?
harrymc,
3
To nie moja aplikacja; brak kontroli nad źródłem.
Jeff E,
Złe wieści, może być konieczne obniżenie DPI, aby uruchomić tę aplikację. Oto niektóre zasoby z hackami, które mogą pomóc: Napraw rozmyte czcionki w Windows 10 , Ustawienia DPI w Windows 10 , Windows 10 DPI rozmyte . Utwórz kopię zapasową przynajmniej jednego punktu przywracania systemu przed wypróbowaniem, na wszelki wypadek. Rozwiązaniem
awaryjnym
5
@harrymc W jaki sposób pomoże którakolwiek z powyższych metod? Problemem nie są rozmyte czcionki lub to, że odmawia uruchomienia, problem polega na tym, że wszystko jest małe . „Niewyraźne” renderowanie czcionek jest tym, co chcę osiągnąć, a ponieważ zrozumiałem pytanie OP, oni też to robią. Ustawienie skalowania DPI na 100% spowodowałoby, że cały system byłby mały; ustawienie rozdzielczości wyświetlania na inną niż rodzima sprawi, że wszystko będzie rozmyte. (W porządku, dla mnie nie jest rozmazany niż na ekranie 1080p, ale nadal.)
millimoose
1
@harrymc I chociaż to ostatnie może sprawić, że aplikacja będzie użyteczna, jestem pewien, że rozumiesz, dlaczego odpowiadasz „jak sprawić, by X działał na ekranie 2160p?” „użycie gorszego wyświetlacza” to jakby brakować sensu.
millimoose

Odpowiedzi:

37

Problem polega na tym, że Swing domyślnie twierdzi, że jest świadomy DPI, więc system Windows nie skaluje go. Użyj tego przełącznika, aby wyłączyć to zachowanie, a system Windows zacznie skalować aplikację swing:

-Dsun.java2d.dpiaware=false

[EDYCJA: Niestety ta flaga nie działa już w Javie 8, testowałem ją w Javie 6. Wygląda na to, że jest to znany problem .]

[EDYCJA 2: Możesz zmodyfikować instalację Java 8, aby działała poprawnie, używając programu do modyfikowania manifestów EXE. Zmieniłem ustawienie z true na false w manifestach w plikach java.exe i javaw.exe, a teraz moje programy Swing poprawnie skalują się w wysokiej rozdzielczości systemu Windows 10. Użyłem do tego tunera zasobów .]

[Edytuj 3] Wystarczy użyć Java 9

CarlG
źródło
Czy potrafisz rozwinąć edycję # 2? Które ustawienie dokładnie zmodyfikowałeś w manifeście?
Tomalak,
W Manifest XML jest to flaga <dpiAware> w <asmv3: application> <asmv3: windowsSettings>
CarlG
O to chodzi. Widziałem tę flagę i ustawiłem ją na false, ale aplikacja (JNLP / WebStart) nie skalowała się poprawnie w żaden sposób. Czy możesz pomyśleć o prostym sposobie sprawdzenia, czy to działa, czy nie, np. Aplikacja testowa, o której wiesz, że reaguje na to ustawienie?
Tomalak,
Webstart jest szczególnie wybredny, ponieważ może być trudno dokładnie określić, który plik wykonywalny, w którym zainstalowałeś jre distro, którego używasz. W ramach kontroli krzyżowej spróbuję uruchomić aplikację bezpośrednio za pomocą java.exe lub javaw.exe i pomijając JWS, aby zobaczyć, czy jest jakaś różnica.
CarlG,
4
Jest to gdzieś pomiędzy komicznym a farsowym. Struktura błędnie zgłasza swoje możliwości, a przełącznik naprawiający błąd jest usuwany. Jedyne obejście? Użytkownicy końcowi mogą kupić narzędzie innej firmy. Ludzie zastanawiają się, dlaczego Java ma tak złą reputację.
Podstawowy
68

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

  1. Znajdź java.exezainstalowany.
  2. Kliknij prawym przyciskiem myszy -> Properties
  3. Idź do Compatibilityzakładki
  4. Czek Override high DPI scaling behavior.
  5. Wybierz SystemdlaScaling performed by:
Elderry
źródło
5
Najlepsze rozwiązanie - miałem problem z uruchomieniem pliku .jnlp, więc musiałem zmienić „C: \ Program Files \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe”, ale działało to jak urok.
Dror Harari
Dla mnie była to wersja JDK. Znaleziono, klikając prawym przyciskiem myszy i otwierając opcje w menedżerze zadań w Windows 10.
Brian Knoblauch
3
W przypadku systemu Windows 10 z uruchomionymi programami uruchamiającymi Minecraft opartymi na Javie musiałem zmienić wszystkie zainstalowane wersje Java w moim systemie, aby działał (java.exe i javaw.exe).
cyberbit
5
Użyłem mniej inwazyjnego wariantu. Utworzyłem skrót do polecenia java -jar myJarFile.jari wykonałem kroki od 2 do 5 dla tego skrótu (Windows 10, Java 8).
Julien Kronegg
1
Dla mnie to byłjavaw.exe
masterxilo
14

Jeśli natknąłeś się na to pytanie, ale naprawdę szukasz rozwiązania, które działa w systemie Linux, jest to dla Ciebie.

Jeśli możesz dodać parametry do pliku javabinarnego uruchamiającego aplikację, możesz użyć opcji -Dprzekazania wartości sun.java2d.uiScalewłaściwości, aby określić współczynnik skalowania dla Java2D. Spowoduje to skalowanie aplikacji. Wartość współczynnika skalowania jest podwójna. Upewnij się, że przekazujesz tę opcję do samego javapliku binarnego, a nie do uruchomionej aplikacji Java.

Przykład: Uruchom NearInfinity.jar ze współczynnikiem skalowania interfejsu użytkownika wynoszącym 2,5

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

Uważam, że ten artykuł jest ogólnie przydatny do uruchamiania systemu Linux na systemach HiDPI, a niektóre rzeczy mogą również działać w systemie Windows: https://wiki.archlinux.org/index.php/HiDPI

Christian Hujer
źródło
To dobrze, choć chciałbym móc uzyskać skalowanie 1 dla JFrames i skalowanie systemu dla JOptionPanes.
NateS,
1
Nie działa dla mnie.
Atte Juvonen
@AtteJuvonen Zamiast po prostu powiedzieć „mój samochód nie działa”, kiedy to nie działa, dlaczego nie opublikujesz nowego pytania opisującego to, czego próbowałeś, jaki był oczekiwany rezultat, jaki był faktyczny wynik, jakiego wiersza poleceń użyłeś i jakie masz komunikaty o błędach?
Christian Hujer
@ChristianHujer Próbowałem uruchomić aplikację Java Swing z tym parametrem (ten sam wiersz poleceń, co w odpowiedzi, z wyjątkiem innej ścieżki do jar) i aplikacja została uruchomiona bez skalowania.
Atte Juvonen
Przepraszam, jeśli wydaje mi się niegrzeczny, tylko sfrustrowany, gdy nic nie działa. FWIW Zamieściłem nowe pytanie w tej sprawie, a także opublikuję nagrodę, gdy tylko pozwoli mi na to strona.
Atte Juvonen
10

Rozwiązanie: Uruchom go w środowisku JRE 9.

Wynika to z faktu, że środowisko wykonawcze Java zadeklarowało się jako „świadome DPI”, ale tak naprawdę nie obsługiwało go dla AWT i Swing. Aplikacje Java były sortowane i renderowane na podstawie pikseli, a nie odpowiednio skalowane, w tym wyświetlacze HiDPI. W każdym razie zostało to niedawno rozwiązane. Zobacz problem JEP 263: Grafika HiDPI w systemach Windows i Linux oraz uaktualnienie .

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

Następnie musisz uruchomić go w środowisku JRE 9, ponieważ naprawdę obsługuje tę funkcję.

Sergio Muriel
źródło
Będę naprawdę podekscytowany, jeśli Java9 to naprawi.
music2myear
3
Nie oznacza to, że należy ponownie skompilować kod. Samo uruchomienie tej samej aplikacji Java 8 w Javie 9+ nie zmieni zachowania
Ramhound
Uruchamianie programów HiDPI na Javie 9 rozwiązuje wiele problemów. goo.gl/3zmL7b
Gernot Krost
3
@Ramhound Nie musisz się ponownie kompilować. Właśnie zbudowałem słoik z JDK8 dla Java 8, który zastępuje pełnoekranową metodę malowania JPanela () na systemie W10 z ekranem 4K i ustawieniem skali 200%. Uruchom z java.exe Java 8, obiekt Graphics2D podany metodzie ma skalowanie 1, a JPanel ma getWidth / height 3840x2160. Uruchom z java.exe Java 9, skalowanie wynosi 2, a szerokość / wysokość to 1920x1080.
Prezydent Dreamspace
1
W Java 9 znajdziesz nową metodę: Screen.getPrimary (). GetOutputScaleX (); co faktycznie działa. (Inną opcją jest użycie rozmiaru ekranu JavaFX, (Screen.getPrimary (). GetVisualBounds ()), który działa, i podziel to na Toolkit.getDefaultToolkit (). GetScreenSize (), Przekonasz się, że możesz zgadywać przy wybranym DPI: 200% da około 2,0, ale niestety 125% nadal daje procent skalowania 1.0.Jednak nawet po przejściu na Javę 9: moje GUI zostały całkowicie zniszczone, gdy przyciski się rozszerzyły, ale niektóre stałe (używane do przerw, wypełniania itp.). nie
woskaty_lyryczny
4

Aby zmusić wszystkie pliki wykonywalne Java do ustawienia „właściwości> kompatybilność> tryb skalowania dpi” 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}

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.

masterxilo
źródło
2

Musisz ustawić PreferExternalManifest w regedit i utworzyć niestandardowe manifesty dla java.exe i javaw.exe, jak podano w poniższej odpowiedzi Stackoverflow https://stackoverflow.com/a/39372897

droidlabel
źródło
3
Dobra wiadomość, aktualizacja Fall Creators pozwala zmienić zachowanie skalowania, klikając prawym przyciskiem myszy element, wybierając właściwości, a następnie zakładkę zgodności. Tworzenie niestandardowego manifestu zewnętrznego nie jest już potrzebne - co jest miłe.
Richard,
0

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

Przejdź do C: \ Program Files (x86) \ Java \ jre \ bin i znajdź javaw.exe. Kliknij prawym przyciskiem myszy, właściwości, zakładkę kompatybilności, zaznacz „zastępuj zachowanie skalowania przy wysokiej DPI” i wybierz „System” (zauważ, że „Ulepszony system” nie działał dla mnie).

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

Kenneth
źródło
0

Wypróbuj Java 10.

Odkryłem, że -Dsun.java2d.dpiaware = false nie działa w Javie 9 lub 10. Również w Javie 8 i 9 moja aplikacja swing jest mała, ale Java 10 ma poprawnie rozmiary w systemie Windows!

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

Właśnie dodałem JAVA_HOME = .... \ java_10 i PATH =% JAVA_HOME% \ bin;% PATH% w pliku bat.

java -jar xxx.jar

Stan Towianski
źródło
-2

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

C:\Program Files (x86)\Common Files\Oracle\Java\javapath
Ryan Reynolds
źródło
2
Witamy w Super User! Proszę nie dodawać „dziękuję” ani „ten działał dla mnie” jako odpowiedzi. Zainwestuj trochę czasu na stronie, a zdobędziesz wystarczające uprawnienia do głosowania na odpowiedzi, które Ci się podobają, co jest sposobem Super User na podziękowanie.
bertieb
Może to być komentarz do odpowiedzi innej osoby. Aby rozwiązać, to należy zastosować ustawienia zgodności do java.exei / lub javaw.exelub korzystać z innych zaleceń. javapathFolder zawiera linki do najnowszych plików wykonywalnych Java zainstalowanych w systemie. Dlatego zastosowanie ustawień Program Filespowinno wystarczyć.
Aleksiej Iwanow
-4

Byłem w stanie uzyskać rozsądną rozdzielczość, gdy uruchomiono go za pomocą wiersza polecenia, takiego jak:

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
użytkownik3301455
źródło
To tak naprawdę nie odpowiada na pytanie i nie zmienia żadnych ustawień High DPI dla java.exelub javaw.exe.
Aleksiej Iwanow