105 votes

Comment puis-je exécuter des applications Java à l'échelle sur un écran à haute résolution ?

J'essaie d'exécuter une application Java (fichier JAR) sur un écran à haute résolution (DPI) sous Windows 10. L'application utilise Swing et n'est donc pas compatible avec la DPI. Normalement, lorsque j'exécute une application qui ne tient pas compte de la DPI, Windows la met à l'échelle pour moi, mais de façon floue. Mais pour une raison quelconque, l'application Java n'est pas mise à l'échelle ; j'obtiens juste une toute petite fenêtre dans le coin avec un texte impossible à lire. Comment puis-je exécuter une application Java avec la mise à l'échelle (floue) à haute résolution de Windows ?

107voto

Elderry Points 1621

Je viens de trouver une solution facile sur ma machine Windows 10 :

  1. Trouvez java.exe que vous avez installé.
  2. Clic droit -> Properties
  3. Aller à Compatibility onglet
  4. Vérifiez Override high DPI scaling behavior.
  5. Choisissez System pour Scaling performed by:

44voto

Joseph Holsten Points 263

Le problème ici semble être que Swing prétend par défaut qu'il est conscient de la DPI, donc Windows ne le met pas à l'échelle. 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 le testais en Java 6. Il semble que ce soit un problème connu .]

[EDIT 2 : Vous pouvez modifier une installation Java 8 pour qu'elle fonctionne correctement, en utilisant un programme pour modifier les manifestes EXE. J'ai changé le paramètre de true (vrai) à false (faux) dans les manifestes à l'intérieur de java.exe et javaw.exe, et maintenant mes programmes Swing s'échelonnent correctement dans Windows 10 high dpi. J'ai utilisé Tuner de ressources à cela.]

[Edit 3] Utilisez simplement Java 9

39voto

Christian Hujer Points 499

Si vous êtes tombé sur cette question mais que vous cherchez en fait une solution qui fonctionne sous Linux, ceci est pour vous.

Si vous pouvez ajouter des paramètres à l java qui lance l'application, vous pouvez utiliser l'option -D pour passer une valeur pour le sun.java2d.uiScale proprité pour spécifier un facteur d'échelle pour Java2D. Cela permettra de mettre votre application à l'échelle. La valeur du facteur d'échelle est un double. Assurez-vous que vous passez cette option à la méthode java lui-même, et non l'application Java lancée.

Exemple : Lancez NearInfinity.jar avec un facteur d'échelle de l'interface utilisateur de 2,5.

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

Vous pouvez également définir l'option GDK_SCALE variable d'environnement. Exemple :

GDK_SCALE=2 java -jar ~/jars/NearInfinity.jar

J'ai trouvé cet article du ArchLinux Wiki assez utile en général pour faire tourner Linux sur des systèmes HiDPI, et certaines des choses pourraient fonctionner sous Windows également.

14voto

Bartuzz Points 265

Solution : Exécutez-le sous JRE 9.

Cela s'explique par le fait que le moteur d'exécution Java s'est déclaré "conscient de la DPI" mais ne l'a pas vraiment pris en charge pour AWT et Swing. Les applications Java étaient dimensionnées et rendues en fonction des pixels plutôt que d'être correctement mises à l'échelle, y compris pour les écrans HiDPI. Quoi qu'il en soit, ce problème a été récemment résolu. Voir le problème JEP 263 : Graphiques HiDPI sur Windows et Linux et le mise à niveau .

Ainsi, augmenter la taille de la police ne fonctionne pas (parce que 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 supporte vraiment cette fonctionnalité.

6voto

masterxilo Points 438

Pour forcer tous les exécutables java à avoir "properties > compatibility > dpi scaling mode" défini sur "System", dans un powershell 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}

pour 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 pourrez plus modifier manuellement le paramètre de mise à l'échelle des ppp dans la boîte de dialogue Propriétés > Compatibilité des fichiers java*.exe.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X