Wie führe ich Java-Apps aus, die auf einem hochauflösenden Display skaliert sind?


75

Ich versuche, eine Java-App (JAR-Datei) auf einem hochauflösenden Display unter Windows 10 auszuführen. Die App verwendet Swing und ist daher nicht DPI-fähig. Normalerweise skaliert Windows eine Anwendung, die nicht DPI-fähig ist, für mich, wenn auch verschwommen. Aber aus irgendeinem Grund skaliert es die Java-App nicht. Ich bekomme nur ein kleines Fenster in der Ecke mit unlesbarem Text. Wie starte ich eine Java-App mit der hochauflösenden (verschwommenen) Skalierung von Windows?


Handelt es sich um Ihre Anwendung und steuern Sie die Quellen / Objekte, oder handelt es sich um eine veraltete Anwendung, die jetzt nicht mehr geändert werden kann?
Harrymc

3
Es ist nicht meine Bewerbung; keine Kontrolle über die Quelle.
Jeff E

Schlechte Nachrichten, möglicherweise müssen Sie Ihre DPI verringern, um diese Anwendung auszuführen. Hier sind einige Ressourcen mit Hacks, die möglicherweise helfen: Fix verschwommene Schriftarten in Windows 10 , DPI-Einstellungen in Windows 10 , Windows 10 DPI verschwommen . Erstellen Sie mindestens eine Systemwiederherstellungspunktsicherung, bevor Sie sie ausprobieren, nur für den Fall. Die Ausweichlösung könnte darin bestehen, zu Windows 7 zurückzukehren.
harrymc 20.11.15

5
@harrymc Wie würde einer der oben genannten helfen? Das Problem ist nicht, dass Schriften verschwommen sind oder nicht ausgeführt werden können. Das Problem ist, dass alles winzig ist . Das "verschwommene" Rendern von Schriftarten ist das, was ich erreichen möchte , und wie ich die Frage des OP verstanden habe, tun sie dies auch. Wenn Sie die DPI-Skalierung auf 100% einstellen, wird das gesamte System winzig. Wenn Sie die Anzeigeauflösung auf eine nicht native Auflösung einstellen, wird alles unscharf. (Okay, für mich ist es nicht unschärfer als auf einem 1080p-Display.)
Millimoose

1
@harrymc Und obwohl letzteres die App möglicherweise benutzerfreundlich macht, verstehst du sicher, warum die Antwort "Wie bringe ich X auf einem 2160p-Display zum Laufen?" bei "benutze ein schlechteres display" fehlt irgendwie der punkt.
Millimoose

Antworten:


37

Das Problem hier scheint zu sein, dass Swing standardmäßig behauptet, DPI-fähig zu sein, sodass Windows es nicht skaliert. Verwenden Sie diesen Schalter, um dieses Verhalten zu deaktivieren und Windows startet die Skalierung Ihrer Swing-App:

-Dsun.java2d.dpiaware=false

[BEARBEITEN: Leider scheint dieses Flag in Java 8 nicht mehr zu funktionieren, ich habe es in Java 6 getestet. Dies scheint ein bekanntes Problem zu sein .]

[BEARBEITEN 2: Sie können eine Java 8-Installation so ändern, dass sie ordnungsgemäß funktioniert. Verwenden Sie dazu ein Programm, um die EXE-Manifeste zu ändern. Ich habe die Einstellung in den Manifesten in java.exe und javaw.exe von true auf false geändert, und jetzt werden meine Swing-Programme in Windows 10 mit hoher Auflösung korrekt skaliert. Ich habe dazu Resource Tuner verwendet .]

[Bearbeiten 3] Verwenden Sie einfach Java 9


Können Sie die Bearbeitung Nr. 2 näher erläutern? Welche Einstellung haben Sie im Manifest genau geändert?
Tomalak

In der Manifest-XML ist dies das <dpiAware> -Flag unter <asmv3: application> <asmv3: windowsSettings>
CarlG,

Das ist der Punkt. Ich habe dieses Flag gesehen und es auf gesetzt false, aber die Anwendung (JNLP / WebStart) wurde in keiner Weise richtig skaliert. Können Sie sich eine einfache Möglichkeit vorstellen, um zu überprüfen, ob dies funktioniert oder nicht, z. B. eine Test-App, von der Sie wissen, dass sie auf diese Einstellung reagiert?
Tomalak

Webstart ist besonders heikel, weil es schwierig sein kann, genau zu bestimmen, welche ausführbare Datei in welcher JRE-Distribution Sie installiert haben, die Sie letztendlich verwenden. Als Gegenprobe würde ich versuchen, Ihre App direkt mit java.exe oder javaw.exe zu starten und JWS zu überspringen, um festzustellen, ob es einen Unterschied gibt.
CarlG

4
Dies ist irgendwo zwischen komisch und lächerlich. Das Framework meldet seine Funktionen falsch und der Switch, der den Fehler behoben hat, wird entfernt. Die einzige Abhilfe? Für Endbenutzer, die ein Drittanbieter-Tool kaufen möchten. Und die Leute fragen sich, warum Java so einen schlechten Ruf hat.
Basic

68

Ich habe gerade eine einfache Lösung für meinen Windows 10-Computer gefunden:

  1. Finde java.exedich installiert.
  2. Rechtsklick -> Properties
  3. Gehe zur CompatibilityRegisterkarte
  4. Prüfen Override high DPI scaling behavior.
  5. Wählen Sie SystemfürScaling performed by:

5
Beste Lösung - Ich hatte dieses Problem beim Ausführen einer .jnlp-Datei, daher musste ich die Datei "C: \ Programme \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe" ändern, aber das funktionierte wie am Schnürchen.
Dror Harari

Für mich war es die JDK-Version. Wird durch Klicken mit der rechten Maustaste und Öffnen der Optionen im Task-Manager in Windows 10 gefunden.
Brian Knoblauch,

3
Unter Windows 10, auf dem Java-basierte Minecraft-Startprogramme ausgeführt wurden, musste ich alle installierten Java-Versionen auf meinem System ändern, damit sie funktionieren (java.exe und javaw.exe).
Cyberbit

5
Ich habe eine weniger aufdringliche Variante verwendet. Ich habe eine Verknüpfung für den Befehl erstellt java -jar myJarFile.jarund die Schritte 2 bis 5 für diese Verknüpfung ausgeführt (Windows 10, Java 8).
Julien Kronegg

1
Für mich war esjavaw.exe
masterxilo

14

Wenn Sie über diese Frage gestolpert sind, aber tatsächlich nach einer Lösung suchen, die unter Linux funktioniert, sind Sie hier richtig.

Wenn Sie der javaBinärdatei, die die Anwendung startet , Parameter hinzufügen können , können Sie mit der Option -Deinen Wert für die sun.java2d.uiScaleEigenschaft übergeben, um einen Skalierungsfaktor für Java2D anzugeben. Dadurch wird Ihre Anwendung skaliert. Der Skalierungsfaktor ist doppelt so hoch. Stellen Sie sicher, dass Sie diese Option an die javaBinärdatei selbst übergeben, nicht an die gestartete Java-Anwendung.

Beispiel: Starten Sie NearInfinity.jar mit einem UI-Skalierungsfaktor von 2,5

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

Ich fand diesen Artikel im Allgemeinen sehr nützlich, um Linux auf HiDPI-Systemen auszuführen, und einige Dinge könnten auch unter Windows funktionieren: https://wiki.archlinux.org/index.php/HiDPI


Dies ist gut, obwohl ich wünschte, ich könnte eine Skalierung von 1 für JFrames und die Systemskalierung für JOptionPanes erhalten.
NateS

1
Funktioniert bei mir nicht.
Atte Juvonen

@AtteJuvonen Anstatt nur zu sagen, dass mein Auto nicht funktioniert, wenn es bei Ihnen nicht funktioniert, warum posten Sie keine neue Frage, in der beschrieben wird, was Sie versucht haben, was das erwartete Ergebnis war, was das tatsächliche war Ergebnis, welche Befehlszeile haben Sie verwendet, und welche Fehlermeldungen haben Sie ggf. erhalten?
Christian Hujer

@ChristianHujer Ich habe versucht, meine Java Swing-App mit diesem Parameter zu starten (dieselbe Befehlszeile wie in Ihrer Antwort, außer dass der Pfad zu jar unterschiedlich ist), und die App wurde ohne Skalierung gestartet.
Atte Juvonen

Tut mir leid, wenn ich unhöflich bin, nur frustriert, wenn nichts funktioniert. FWIW Ich habe eine neue Frage dazu gestellt und werde auch ein Kopfgeld dafür ausstellen, sobald die Seite es mir erlaubt.
Atte Juvonen

10

Lösung: Führen Sie es auf JRE 9 aus.

Dies liegt daran, dass sich die Java-Laufzeit als "DPI-fähig" deklariert hat, dies aber für AWT und Swing nicht wirklich unterstützt hat. Java-Anwendungen wurden nicht richtig skaliert, sondern auf der Basis von Pixeln skaliert und gerendert. Dazu gehörten auch HiDPI-Anzeigen. Sowieso ist dieses vor kurzem gelöst worden. Siehe die Ausgabe JEP 263: HiDPI-Grafik unter Windows und Linux und das Upgrade .

Das Erhöhen der Schriftgröße funktioniert also nicht (weil es den Rest der Dinge nicht vergrößert). das Argument jvm -Dsun.java2d.dpiaware=falsefunktioniert nicht (weil es nicht wirklich unterstützt wird); und die Manifest-Datei + Registry-Bearbeitung (für Windows) funktioniert einfach nicht.

Dann müssen Sie es auf JRE 9 ausführen, da es diese Funktion wirklich unterstützt.


Ich werde sehr gespannt sein, ob Java9 dies behebt.
music2myear

3
Dies weist nicht darauf hin, dass Sie den Code neu kompilieren müssen. Das Ausführen derselben Java 8-Anwendung auf Java 9+ ändert nichts am Verhalten
Ramhound

Das Ausführen von HiDPI-Programmen unter Java 9 löst viele Probleme. goo.gl/3zmL7b
Gernot Krost

3
@ Ramhound Sie müssen nicht neu kompilieren. Ich habe gerade eine JAR mit JDK8 für Java 8 erstellt, die eine Vollbild-JPanel-Methode paint () auf einem W10-System mit 4K-Bildschirm und 200% Skalierung überschreibt. Wird mit der java.exe von Java 8 ausgeführt, hat das der Methode zugewiesene Graphics2D-Objekt eine Skalierung von 1 und das JPanel eine getWidth / height von 3840x2160. Laufen Sie mit der java.exe von Java 9, die Skalierung ist 2 und die Breite / Höhe ist 1920x1080.
Dreamspace Präsident

1
In Java 9 finden Sie eine neue Methode: Screen.getPrimary (). GetOutputScaleX (); was eigentlich funktioniert. (Die andere Möglichkeit besteht darin, die JavaFX-Bildschirmgröße (Screen.getPrimary (). GetVisualBounds ()) zu verwenden, die funktioniert, und diese durch Toolkit.getDefaultToolkit (). GetScreenSize () zu teilen. Sie werden feststellen, dass Sie eine Vermutung erhalten können Bei der ausgewählten DPI: 200% ergeben ungefähr 2,0, aber 125% ergeben leider immer noch einen Skalierungsprozentsatz von 1,0. Aber auch nach dem Umstieg auf Java9: Ich fand meine GUIs völlig zerstört, als die Schaltflächen erweitert wurden, aber einige der Konstanten (verwendet für Lücken, Polsterung usw.)
wax_lyrical

4

Führen Sie in einer Administrator-PowerShell (win-x, a) die folgenden Schritte aus, um zu erzwingen, dass für alle ausführbaren Java-Dateien "Eigenschaften> Kompatibilität> dpi-Skalierungsmodus" die Option "System" festgelegt ist:

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

rückgängig machen:

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

Anstelle von HKCU können Sie auch HKLM verwenden. In diesem Fall können Sie die Einstellung für die dpi-Skalierung im Dialogfeld Eigenschaften> Kompatibilität der java * .exe-Dateien nicht mehr manuell ändern.


2

Sie müssen PreferExternalManifest in regedit festlegen und benutzerdefinierte Manifeste für java.exe und javaw.exe erstellen, wie in der folgenden Antwort auf stackoverflow https://stackoverflow.com/a/39372897 angegeben


3
Gute Nachricht, mit dem Fall Creators-Update können Sie das Skalierungsverhalten ändern, indem Sie mit der rechten Maustaste auf das Element klicken, Eigenschaften auswählen und dann auf die Registerkarte Kompatibilität klicken. Das Erstellen eines benutzerdefinierten externen Manifests ist nicht mehr erforderlich.
Richard

0

Die Lösung von Elderry ist gut, aber was ist, wenn Sie eine JAR-Datei unter Windows ausführen möchten und keine Kompatibilitätsoptionen vorhanden sind?

Gehen Sie zu C: \ Programme (x86) \ Java \ jre \ bin und suchen Sie nach javaw.exe. Klicken Sie mit der rechten Maustaste auf Eigenschaften, Registerkarte Kompatibilität, aktivieren Sie das Kontrollkästchen "Skalierungsverhalten bei hohen DPI-Werten überschreiben" und wählen Sie "System" aus (beachten Sie, dass "System erweitert" bei mir nicht funktioniert hat).

JAR-Dateifenster sollten jetzt korrekt mit lesbarem Text skaliert werden. Wenn nicht, kann dies bedeuten, dass Windows JAR-Dateien nicht wie gewünscht mit javaw.eve verknüpft. Ein Fix für einen Drittanbieter ist verfügbar unter: https://johann.loefflmann.net/en/software/jarfix/index.html


0

Probieren Sie Java 10 aus.

Ich habe festgestellt, dass -Dsun.java2d.dpiaware = false in Java 9 oder 10 nicht funktioniert. Auch für Java 8 und 9 ist meine Swing-App klein, aber Java 10-Größen in Windows richtig!

Also für eine App, die Sie aus einer Fledermausdatei wie folgt ausführen können: java -jar xxx.jar

Ich habe gerade JAVA_HOME = .... \ java_10 und PATH =% JAVA_HOME% \ bin;% PATH% in die bat-Datei eingefügt.

java -jar xxx.jar


-2

Ich habe die meisten dieser Lösungen ausprobiert, aber die für mich funktionierende Lösung bestand darin, den Systemkompatibilitätsmodus für die Dateien festzulegen, die ich an folgendem Speicherort gefunden habe:

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

2
Willkommen bei Super User! Bitte geben Sie nicht "Danke" oder "das hat bei mir funktioniert" als Antwort an. Wenn Sie etwas Zeit in die Website investieren, erhalten Sie ausreichende Berechtigungen , um die von Ihnen gewünschten Antworten zu verbessern. Dies ist die Super-User-Art, sich zu bedanken.
Bertieb

Dies könnte ein Kommentar zur Antwort einer anderen Person sein. Um dies zu beheben, müssen Kompatibilitätseinstellungen auf andere Empfehlungen angewendetjava.exe und / javaw.exeoder diese verwendet werden. Der javapathOrdner enthält Links zu den neuesten auf dem System installierten ausführbaren Java-Dateien. Das Anwenden der Einstellungen in Program Filessollte also ausreichen.
Alexey Ivanov

-4

Ich war in der Lage, vernünftige dpi zu bekommen, wenn ich mit der Eingabeaufforderung lief, wie:

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

Dies beantwortet die Frage nicht wirklich und ändert keine Einstellungen für hohe DPI von java.exeoder javaw.exe.
Alexey Ivanov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.