web-dev-qa-db-fra.com

Comment définir le DPI de Java Applications Swing sous Windows / Linux?

Si vous avez un moniteur avec un DPI supérieur à 150 (tel que Macbook Pro), vous pouvez également trouver le problème: , la police de l'application Swing Java est trop petite pour Moniteur DPI élevé , et je ne peux pas du tout modifier la taille de la police (Il ignore directement le DPI Windows, affichant uniquement le très original DPI-- > 96 ). Je ne peux rien faire d'autre que changer la résolution de l'écran, ce qui pourrait tout rendre flou sur l'écran LCD.

Oui, j'ai un ordinateur portable avec un moniteur haute résolution, 15,6 'avec une résolution de 1920x1080, certaines applications de bureau Java sont très petites sur mon ordinateur portable, telles que Matlab, Burpsuite, etc. J'ai effectué une recherche très Internet long temps, mais ne peut toujours pas trouver une méthode pour le problème. Je sais que je peux modifier les polices JRE via JRE_HOME/lib/font/fontconfig.properties.src, Mais je ne trouve aucun endroit pour définir la taille de police ou le DPI par défaut des polices de bureau Java.

Le problème n'a pas de solution? Avez-vous un moniteur haute résolution? Comment faites-vous avec de telles applications? Swing abandonne-t-il les utilisateurs à haute résolution?

66
Searene

J'étudie actuellement ce problème sous Windows. Voici ce que j'ai trouvé:

La plupart des Swing Look & Feels ne supportent pas du tout le DPI élevé, pas même Nimbus même s'il est supposé être évolutif. J'ai trouvé d'anciens articles de blog disant que Nimbus pourrait éventuellement offrir une mise à l'échelle DPI élevée, mais apparemment cela ne s'est jamais produit.

La seule exception est System LAF, mais sa police par défaut est environ 10% plus petite que la taille réelle de la police système, quel que soit le réglage DPI. De plus, System doit être sélectionné explicitement comme décrit ici: http://docs.Oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

Il n'y a pas non plus de facteur de mise à l'échelle que vous puissiez définir dans Swing. Le LAF spécifique doit fournir un code pour gérer la mise à l'échelle. Donc, le mieux que vous puissiez faire est de sélectionner System et d’espérer que cela suffira.

Cependant, JavaFX évolue correctement et automatiquement jusqu’à 150% sur mon système. Si possible, je vous suggère d'utiliser JavaFX pour construire votre interface graphique.

edit: J'ai créé quelques petits programmes de test et pris des captures d'écran de comparaison pour divers cadres d'interface graphique, thèmes Swing et paramètres DPI. Ceci pourrait être informatif pour les personnes lisant cette question: http://kynosarges.org/GuiDpiScaling.html

37
user574171

Réponse courte: vous devez l'exécuter sur JRE 9.

Longue réponse:
Cela est dû au fait que le moteur d'exécution Java s'est déclaré "conscient de la DPI" mais ne l'a pas vraiment prise en charge pour AWT et Swing. Java = les applications ont été dimensionnées et rendues en pixels plutôt qu’elles ont été correctement dimensionnées, ce qui incluait les écrans HiDPI. Quoi qu’il en soit, cela a été résolu récemment. Voir le problème JEP 263: Graphiques HiDPI sous Windows et Linux et les - mise à nivea .

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 ce n'est pas vraiment supporté); et le fichier manifeste + modification du registre (pour Windows) ne fonctionne tout simplement pas.

Solution: vous devez l'exécuter sur JRE 9 car cette fonctionnalité est vraiment prise en charge.

7
Sergio Muriel

Sous Linux , il ne semble pas possible de faire évoluer la mise à l'échelle avec un aspect ou une sensation de type Swing, selon mes expériences. Cependant, il est possible de le faire en utilisant un hack impliquant VNC, vncdesk . Voici ma configuration pour exécuter gradle --gui sous vncdesk:

.vncdesk/1/settings.ini:

[desktop]
width = 1050
height = 650

[window]
title = gradle
name = gradle in vncdesk
class = GradleInVncdesk
scale_factor = 2

.vncdesk/1/startup:

#!/bin/sh
cd "$INVOCATION_DIR"
matchbox-window-manager&
exec gradle --gui "$@"
4
Robin Green

J'ai réussi à le résoudre en suivant ces instructions: Link .

C'est en allemand, mais je vais traduire les choses importantes.

Créez cette clé de registre:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide]
"PreferExternalManifest"=dword:00000001

Créez un fichier manifeste avec ce contenu:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Assembly xmlns="urn:schemas-Microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-Microsoft-com:asm.v3">

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*">
    </assemblyIdentity>
  </dependentAssembly>
</dependency>

<dependency>
  <dependentAssembly>
    <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="AMD64" publicKeyToken="1fc8b3b9a1e18e3b">
    </assemblyIdentity>
  </dependentAssembly>
</dependency>

<trustInfo xmlns="urn:schemas-Microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
    </requestedPrivileges>
  </security>
</trustInfo>

<asmv3:application>
  <asmv3:windowsSettings xmlns="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">
    <ms_windowsSettings:dpiAware xmlns:ms_windowsSettings="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">false</ms_windowsSettings:dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>

</Assembly>

Copiez-le dans le répertoire bin où se trouvent Java.exe et javaw.exe et nommez-le Java.exe.manifest et javaw.exe.manifest _ (Vous aurez deux fichiers avec le même contenu mais des noms différents).

HTH.

Bernd

2
eferrari