Prise en charge de l’affichage Java 9 hdpi – images multi-résolutions – convention de nom et chargement sous Windows

Selon ces articles:

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

Java 9 doit prendre en charge les affichages à haute résolution (mise à l’échelle automatique de la résolution) dans Swing. Je l’ai testé sur la dernière version de Java 9 Early Access + sur Zulu 9 et il fonctionne vraiment bien.

J’étais incapable de résoudre un seul problème: le chargement d’images haute résolution / rétine.

Selon les articles (liens) ci-dessus et ci-dessous, il convient d’utiliser une convention de nom Apple ( @ 2x ):

image.png , [email protected] , [email protected] , 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 aucune de ces œuvres (la seule image de base était chargée et floue).

Selon ce:

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

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

Quelqu’un a-t-il déjà expérimenté cela (en utilisant Swing ou même JavaFX)? Je ne suis pas sûr que je fasse quelque chose de mal ou que cette fonctionnalité ne soit pas implémentée dans la version préliminaire de Java 9 actuelle.


Mettre à jour:

Il devrait être possible:

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

J’ai également essayé de suivre les conventions de dénomination (décrites ici ):

 Windows : image.scale-.png (image.scale-140.png) Linux : image.java-scale2x.png Mac : [email protected] and image.java-scale2x.png 

Cependant, je ne trouve aucune solution de travail ou information officielle. Je ne comprends pas – les écrans hdpi sont courants aujourd’hui et les applications Java ressemblent à des s … sur eux.

Dans le cadre de la prise en charge de HiDPI , Java 9 a introduit un support multi-résolution via l’interface java.awt.MultiResolutionImage et les classes java.awt.image.AbstractMultiResolutionImage et al. Bien qu’ils soient pris en charge dans Swing, il y a eu des bugs et des malentendus dans ce domaine.

Celles-ci n’existent pas dans les versions antérieures de Java. Par conséquent, si vous souhaitez que vos utilisateurs puissent continuer à s’exécuter avec des environnements d’exécution plus anciens, vous devrez écrire du code pour utiliser des classes Image régulières lors de l’exécution sur des JRE antérieurs.

Pour les utiliser, vous faites quelque chose comme :

  • Commencez avec un ensemble d’images de différentes résolutions:

entrer la description de l'image ici

  • Ensuite, créez et chargez MultiResolutionImage:

     List imgList = new ArrayList(); 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])); 
  • Utilisez l’object mrImage comme n’importe quelle autre image.

La convention de dénomination n’a rien d’automatique: La résolution de l’image est extraite du contenu du fichier image.