36 votes

Prise en charge de l'affichage hdpi de Java 9 - images multirésolution - convention de nom et chargement dans Windows

D'après ces articles :

http://news.kynosarges.org/2015/06/29/javafx-dpi-scaling-fixed
https://twitter.com/michaelsamarin/status/729234779292483584

Java 9 devrait prendre en charge les affichages à haute DPI (mise à l'échelle automatique de la DPI) dans Swing. Je l'ai testé sur la dernière version de Accès anticipé à Java 9 + sur Zulu 9 et ça marche et ça a l'air vraiment bien.

Je n'ai pu résoudre qu'une seule chose : le chargement des images haute résolution/rétine.

D'après les articles (liens) ci-dessus et ci-dessous, il devrait utiliser une Convention de nom d'Apple ( @2x ) :

image.png , image@2x.png , image@3x.png etc.

J'ai testé ces méthodes de chargement :

Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("something/image.png"));

et

ImageIO.read(getClass().getResource("/something/image.png"));

Mais rien de tout cela ne fonctionne (la seule image de base était chargée et floue).

D'après ceci :

https://netbeans.org/bugzilla/show_bug.cgi?id=239745

La première méthode devrait être prometteuse.

Quelqu'un a-t-il une expérience dans ce domaine (en utilisant Swing ou même JavaFX) ? Je ne sais pas si je fais quelque chose de mal ou si cette fonctionnalité n'est pas encore implémentée dans la préversion actuelle de Java 9.


Mise à jour :

Cela devrait être possible :

http://openjdk.java.net/jeps/263

J'ai également essayé de suivre les conventions d'appellation (décrites dans le document ici ) :

Windows : image.scale-<dpi-value>.png (image.scale-140.png)
Linux : image.java-scale2x.png
Mac : image@2x.png and image.java-scale2x.png

Cependant, je ne trouve aucune solution fonctionnelle ou information officielle. Je ne comprends pas - les écrans hdpi sont courants aujourd'hui et les applications Java ressemblent à des s... sur ces écrans.

9voto

Bob Jacobsen Points 930

Dans le cadre de Support HiDPI Java 9 a introduit la prise en charge de la multirésolution via la fonction java.awt.MultiResolutionImage et l'interface java.awt.image.AbstractMultiResolutionImage et autres classes. Bien qu'elles soient prises en charge dans Swing, il y a eu bogues et malentendus dans ce domaine.

Elles n'existent pas dans les versions antérieures de Java, donc si vous voulez que vos utilisateurs puissent continuer à s'exécuter avec des runtimes antérieurs, vous allez devoir écrire du code pour utiliser des classes d'image ordinaires lors de l'exécution sur des JRE antérieurs.

Pour les utiliser, il faut faire quelque chose comme :

  • Commencez par un ensemble d'images de différentes résolutions :

enter image description here

  • Ensuite, créez et chargez l'image MultiResolutionImage :

    List<Image> imgList = new ArrayList<Image>();
    imgList.add(ImageIO.read(new File("320px-Eagle.jpg"));
    imgList.add(ImageIO.read(new File("800px-Eagle.jpg"));
    imgList.add(ImageIO.read(new File("1024px-Eagle.jpg"));
    imgList.add(ImageIO.read(new File("1280px-Eagle.jpg"));
    imgList.add(ImageIO.read(new File("Eagle.jpg"));
    MultiResolutionImage mrImage = new BaseMultiResolutionImage(imgList.toArray(new Image[0]));
  • L'utilisation de la mrImage comme n'importe quelle autre image.

Il n'y a rien d'automatique dans la convention de dénomination : La résolution de l'image est tirée du contenu du fichier image.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X