J'essaie d'exécuter une application Java (fichier JAR) sur un écran haute résolution sous Windows 10. L'application utilise Swing et n'est donc pas compatible DPI. Normalement, lorsque j'exécute une application qui n'est pas compatible DPI, Windows la redimensionne pour moi, même si elle est floue. Mais pour une raison quelconque, l'application Java n'est pas mise à l'échelle. Je viens d'avoir une petite fenêtre dans le coin avec un texte impossible à lire. Comment exécuter une application Java avec la mise à l'échelle haute résolution (flou) de Windows?
Le problème ici semble être que Swing affirme par défaut qu'il est conscient de la DPI, donc Windows ne le redimensionne pas. Utilisez ce commutateur pour désactiver ce comportement et Windows commencera à mettre à l'échelle votre application swing:
-Dsun.Java2d.dpiaware=false
[EDIT: Malheureusement, ce drapeau ne semble plus fonctionner en Java 8, je l’étais en train de le tester en Java 6. On dirait que c’est un problème connu .]
[EDIT 2: Vous pouvez modifier une installation Java 8 pour qu'elle fonctionne correctement, à l'aide d'un programme permettant de modifier les manifestes EXE. J'ai modifié le paramètre de true à false dans les manifestes à l'intérieur de Java.exe et de javaw.exe. Désormais, mes programmes Swing évoluent correctement sous Windows 10 en haute résolution. J'ai utilisé Resource Tuner à cela.]
[Edit 3] Il suffit d'utiliser Java 9
Je viens de trouver une solution facile sur mon ordinateur Windows 10:
Java.exe
que vous avez installé.Properties
Compatibility
Override high DPI scaling behavior.
System
pour Scaling performed by:
Si vous êtes tombé sur cette question mais êtes réellement à la recherche d’une solution qui fonctionne sous Linux, c’est pour vous.
Si vous pouvez ajouter des paramètres au binaire Java
qui lance l'application, vous pouvez utiliser l'option -D
pour transmettre une valeur pour la propriété Sun.Java2d.uiScale
afin de spécifier un facteur de mise à l'échelle pour Java2D. Cela fera évoluer votre application. La valeur du facteur d'échelle est un double. Assurez-vous de transmettre cette option au binaire Java
lui-même, et non à l'application Java lancée.
Exemple: Lancez NearInfinity.jar avec un facteur de mise à l'échelle de l'interface utilisateur de 2,5
Java -Dsun.Java2d.uiScale=2.5 -jar ~/jars/NearInfinity.jar
J'ai trouvé cet article plutôt utile en général pour exécuter Linux sur les systèmes HiDPI, et certaines choses pourraient également fonctionner sous Windows: https://wiki.archlinux.org/index.php/HiDPI
Solution: exécutez-le sur JRE 9.
En effet, le moteur d'exécution Java s'est déclaré "compatible DPI" mais ne l'a pas vraiment pris en charge pour AWT et Swing. Les applications Java ont été dimensionnées et rendues en pixels plutôt que d'être correctement mises à l'échelle, ce qui inclut les écrans HiDPI. Quoi qu'il en soit, cela a été résolu récemment. Voir le problème JEP 263: HiDPI Graphics sous Windows et Linux et la upgrade .
Donc, augmenter la taille de la police ne fonctionne pas (car cela n'augmente pas le reste des choses); l'argument jvm -Dsun.Java2d.dpiaware=false
ne fonctionne pas (car il n'est pas vraiment pris en charge); et le fichier manifeste + modification du registre (pour Windows) ne fonctionne tout simplement pas.
Ensuite, vous devez l'exécuter sur JRE 9 car il prend réellement en charge cette fonctionnalité.
Pour forcer tous les exécutables Java à "propriétés> compatibilité> mode de redimensionnement dpi" définis sur "Système", dans un PowerShell d'administrateur (win-x, a), exécutez:
$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}
défaire:
$javaexes | foreach {REG delete "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /V $_ /f}
Au lieu de HKCU, vous pouvez utiliser HKLM, mais vous ne pouvez plus modifier manuellement le paramètre de mise à l'échelle dpi dans la boîte de dialogue propriétés> compatibilité des fichiers Java * .exe.
Vous devez définir PreferExternalManifest dans regedit et créer des manifestes personnalisés pour Java.exe et javaw.exe, comme indiqué dans le message stackoverflow suivant answer https://stackoverflow.com/a/39372897
Merci pour Kenneth. Je trouve C:\Program Files (x86)\Java\jre\bin\Java.exe
puis right click -> properties -> compatibility tab -> "override high DPI scaling behavior"
et sélectionnez System
, puis cela fonctionne. J'ai également essayé de la même manière de modifier la compatibilité de javaw.exe
, cela fonctionne également.
PS: Je lance burpsuite.jar
sur win10 1703 en utilisant cette méthode.
La solution Elderry est bonne, mais que se passe-t-il si vous souhaitez exécuter un fichier jar sous Windows sans options de compatibilité?
Accédez à C:\Program Files (x86)\Java\jre\bin et recherchez javaw.exe. Cliquez avec le bouton droit de la souris sur Propriétés, onglet Compatibilité, cochez la case "Remplacer le comportement de redimensionnement DPI élevé" et sélectionnez "Système" (notez que "Système amélioré" ne fonctionnait pas pour moi).
Les fenêtres de fichiers jar doivent maintenant s’adapter correctement avec un texte lisible. Sinon, cela pourrait signifier que Windows ne lie pas les fichiers de type jar à javaw.eve comme il se doit. Un correctif tiers est disponible à l’adresse: https://johann.loefflmann.net/fr/software/jarfix/index.html
Essayez Java 10.
J'ai trouvé que -Dsun.Java2d.dpiaware = false ne fonctionne pas sous Java 9 ou 10. De plus, pour Java 8 et 9, mon application est petite, mais Java 10 se taille correctement dans Windows!
donc pour une application que vous pouvez exécuter à partir d'un fichier bat comme: Java -jar xxx.jar
Je viens d'ajouter Java_HOME = ....\Java_10 et PATH =% Java_HOME%\bin;% PATH% dans le fichier bat.
Java -jar xxx.jar