Comment puis-je exécuter des applications Java sur un écran haute résolution avec une résolution supérieure?

75

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?

Jeff E
la source
S'agit-il de votre application et contrôlez-vous les sources / objets, ou s'agit-il d'une application héritée désormais non modifiable?
harrymc
3
Ce n'est pas ma demande aucun contrôle sur la source.
Jeff E
Mauvaise nouvelle, vous devrez peut-être réduire votre DPI pour exécuter cette application. Voici quelques ressources susceptibles d’être utiles pour les hacks: Corriger les polices floues dans Windows 10 , les paramètres DPI dans Windows 10 , Windows 10 DPI floue . Créez au moins une sauvegarde du point de restauration du système avant de les essayer, au cas où. La solution de rechange pourrait être de revenir à Windows 7.
harrymc
5
@harrymc Comment l'une des solutions ci-dessus aiderait-elle? Le problème n'est pas que les polices floues ou qu'il refuse de fonctionner, le problème est que tout est minuscule . Le rendu de police "flou" est ce que je veux réaliser, et si j'ai bien compris la question du PO, ils le font aussi. Définir la résolution DPI à 100% rendrait tout le système minuscule; régler la résolution de l'écran sur une résolution non-native rendrait tout flou. (OK, pas de flou sur un écran 1080p pour moi, mais quand même.)
millimoose
1
@harrymc Et bien que ce dernier puisse rendre l'application utilisable, je suis sûr que vous comprenez pourquoi ", comment puis-je faire en sorte que X fonctionne sur un écran 2160p?" avec "utiliser un affichage pire" est un peu manquer le point.
Millimoose

Réponses:

37

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 le testais 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 changé 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 dans Windows 10 haute résolution. J'ai utilisé Resource Tuner pour cela.]

[Edit 3] Il suffit d'utiliser Java 9

CarlG
la source
Pouvez-vous élaborer sur l'édition n ° 2? Quel cadre avez-vous modifié dans le manifeste, exactement?
Tomalak
Dans le fichier XML Manifest, il s'agit de l'indicateur <dpiAware> sous <asmv3: application> <asmv3: windowsSettings>
CarlG
C'est le but. J'ai vu cet indicateur et je l'ai défini sur false, mais l'application (JNLP / WebStart) n'a pas été mise à l'échelle correctement. Pouvez-vous penser à un moyen simple de vérifier si cela fonctionne ou non, par exemple une application de test que vous connaissez qui répond à ce paramètre?
Tomalak
Webstart est particulièrement astucieux, car il peut être difficile de déterminer avec précision quel fichier exécutable est installé dans la distribution jre que vous avez installée. En guise de vérification, j'essaierais de lancer votre application directement avec java.exe ou javaw.exe et de sauter JWS pour voir s'il y a une différence.
CarlG
4
C'est quelque part entre le comique et le ridicule. La structure rapporte mal ses capacités et le commutateur qui a corrigé l'erreur est supprimé. Le seul problème? Pour que les utilisateurs finaux achètent un outil tiers. Et les gens se demandent pourquoi Java a une si mauvaise réputation.
Basic
68

Je viens de trouver une solution facile sur mon ordinateur Windows 10:

  1. Trouvez- java.exevous installé.
  2. Clic droit -> Properties
  3. Aller à l' Compatibilityonglet
  4. Vérifier Override high DPI scaling behavior.
  5. Choisissez SystempourScaling performed by:
Les personnes âgées
la source
5
Meilleure solution - J'ai eu ce problème en exécutant un fichier .jnlp, donc j’ai dû changer le dossier "C: \ Program Files \ Java \ jre1.8.0_131 \ bin \ jp2launcher.exe", mais cela a fonctionné comme un charme.
Dror Harari
Pour moi, c'était la version JDK. Trouvé par un clic droit et en ouvrant les options à partir du gestionnaire de tâches de Windows 10.
Brian Knoblauch
3
Pour Windows 10, exécutant des lanceurs Minecraft basés sur Java, je devais modifier toutes les versions Java installées sur mon système pour que cela fonctionne (java.exe et javaw.exe).
cyberbit
5
J'ai utilisé une variante moins intrusive. J'ai créé un raccourci pour la commande java -jar myJarFile.jaret effectué les étapes 2 à 5 de ce raccourci (Windows 10, Java 8).
Julien Kronegg
1
Pour moi, c'étaitjavaw.exe
masterxilo
14

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 javabinaire qui lance l'application, vous pouvez utiliser l'option -Dpour transmettre une valeur à la sun.java2d.uiScalepropriété 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 javabinaire lui-même, pas à 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

Christian Hujer
la source
C'est bien, bien que j'aimerais pouvoir obtenir une mise à l'échelle de 1 pour JFrames et la mise à l'échelle du système pour JOptionPanes.
NateS
1
Ca ne marche pas pour moi
Atte Juvonen
@AtteJuvonen Au lieu de simplement dire "ma voiture ne marche pas", quand ça ne marche pas pour vous, pourquoi ne pas poster une nouvelle question décrivant ce que vous avez essayé, quel était le résultat attendu, quel était le résultat réel résultat, quelle ligne de commande vous avez utilisée et quels messages d’erreur vous avez éventuellement?
Christian Hujer
@ChristianHujer J'ai essayé de lancer mon application Java Swing avec ce paramètre (même ligne de commande que celle de votre réponse, sauf que le chemin d'accès à jar est différent) et que l'application a été lancée sans mise à l'échelle.
Atte Juvonen
Désolé si je semble impoli, juste frustré quand rien ne fonctionne. FWIW J'ai posté une nouvelle question à ce sujet et je posterai également une prime dès que le site me le permettra.
Atte Juvonen
10

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 PEC 263: Graphiques HiDPI sous Windows et Linux et la mise à niveau .

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=falsene fonctionne pas (car il n'est pas vraiment supporté); 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é.

Sergio Muriel
la source
Je serai vraiment excité si Java9 corrige cela.
music2myear
3
Cela ne vous indique pas que vous devez recompiler le code. Exécuter simplement la même application Java 8 - sur Java 9+ ne changera pas le comportement
Ramhound
L'exécution de programmes HiDPI sur Java 9 résout de nombreux problèmes. goo.gl/3zmL7b
Gernot Krost
3
@Ramhound Vous n'avez pas besoin de recompiler. Je viens de construire un bocal avec JDK8 pour Java 8 qui remplace la méthode paint () de JPanel en plein écran sur un système W10 avec un écran 4K et un réglage d’échelle de 200%. Exécutée avec le fichier java.exe de Java 8, l’objet Graphics2D attribué à la méthode a une échelle de 1 et l’image JPanel a une largeur / hauteur de 3840x2160. Exécutez avec le java.exe de Java 9, la mise à l'échelle est 2 et la largeur / hauteur est 1920x1080.
Dreamspace President
1
Vous trouverez une nouvelle méthode dans Java 9: ​​Screen.getPrimary (). GetOutputScaleX (); qui fonctionne réellement. (L’autre option consiste à utiliser la taille d’écran JavaFX (Screen.getPrimary (). GetVisualBounds ()) qui fonctionne, puis à la diviser en fonction de Toolkit.getDefaultToolkit (). GetScreenSize (), vous constaterez que vous pouvez obtenir une estimation. Au DPI sélectionné: 200% correspondra à environ 2,0, mais malheureusement à 125% toujours à un pourcentage de redimensionnement 1.0 Cependant, même après le passage à Java9: j’ai trouvé mes interfaces graphiques complètement détruites lorsque les boutons se développaient, mais certaines constantes (utilisé pour les espaces, le rembourrage, etc.) pas.
wax_lyrical
4

Pour forcer tous les exécutables java à définir "propriétés> compatibilité> mode de redimensionnement dpi" 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.

masterxilo
la source
2

Vous devez définir PreferExternalManifest dans regedit et créer des manifestes personnalisés pour java.exe et javaw.exe, comme indiqué dans la réponse suivante de stackoverflow https://stackoverflow.com/a/39372897

droidlabel
la source
3
Bonne nouvelle, la mise à jour de Fall Creators vous permet de modifier le comportement de la mise à l'échelle en cliquant avec le bouton droit de la souris sur l'élément, en sélectionnant les propriétés, puis l'onglet Compatibilité. La création d'un manifeste externe personnalisé n'est plus nécessaire - ce qui est agréable.
Richard
0

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 suivante : https://johann.loefflmann.net/fr/software/jarfix/index.html

Kenneth
la source
0

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

Stan Towianski
la source
-2

J'ai essayé la plupart de ces solutions, mais celle qui a fonctionné pour moi a été de définir le mode de compatibilité système sur les fichiers trouvés à l'emplacement suivant:

C:\Program Files (x86)\Common Files\Oracle\Java\javapath
Ryan Reynolds
la source
2
Bienvenue sur Super User! S'il vous plaît ne pas ajouter "merci" ou "celui-ci a fonctionné pour moi" comme réponses. Investissez un peu de temps sur le site et vous obtiendrez des privilèges suffisants pour que les réponses qui vous intéressent soient majorées au maximum, ce qui est la façon dont le super utilisateur dit merci.
Bertieb
Cela pourrait être un commentaire sur la réponse de quelqu'un d'autre. Pour fixer, il est nécessaire d'appliquer les paramètres de compatibilité pour java.exeet / ou javaw.exeou utiliser d' autres recommandations. Le javapathdossier contient des liens vers les derniers exécutables Java installés sur le système. Ainsi, appliquer les paramètres Program Filesdevrait suffire.
Alexey Ivanov
-4

J'ai réussi à obtenir une résolution dpi sensible lors de l'exécution à l'aide d'une invite de commande telle que:

%SystemRoot%\system32\cmd.exe /C C:\your.file.path\yourJarFile.jar
utilisateur3301455
la source
Cela ne répond pas vraiment à la question et ne modifie pas les paramètres de haute résolution de java.exeou javaw.exe.
Alexey Ivanov