Java Swing :Afficher des images à partir d'un pot
-
09-06-2019 - |
Question
Lors de l'exécution d'une application Java à partir d'Eclipse, mon ImageIcon s'affiche très bien.
Mais après avoir créé un pot, le chemin vers l’image est évidemment perturbé.
Existe-t-il un moyen d'extraire une image du pot au moment de l'exécution afin que je puisse ensuite l'ouvrir ?Ou existe-t-il une meilleure façon de procéder ?
J'aimerais distribuer un seul fichier jar si possible.
La solution
Pour créer un ImageIcon
à partir d'un fichier image dans les mêmes pots, votre code est chargé :
new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg"))
Class.getResource
renvoie l'URL d'une ressource (ou null
!). ImageIcon
a des constructeurs qui se chargent à partir d'une URL.
Pour construire une URL pour une ressource dans un fichier jar ne figurant pas sur votre "classpath", consultez la documentation pour java.net.JarURLConnection
.
Autres conseils
Vous pouvez essayer quelque chose comme :
InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg");
Dans votre fichier JAR, vous pourriez avoir une structure de répertoires de :
MonJAR.jar
- com (fichiers de classe ici)
- images
----image.jpg
Cela fonctionne pour moi pour charger et définir l'image d'arrière-plan du volet de contenu :
jar (ou chemin de construction) contient :
- com
- img
---- bg.png
java contient :
JFrame f = new JFrame("Testing load resource from jar");
try {
BufferedImage bg = ImageIO.read(getClass().getResource("/img/bg.png"));
f.setContentPane(new ImagePanel(bg));
} catch (IOException e) {
e.printStackTrace();
}
Testé et fonctionnel en exécution en pot et sans pot (c'est le terme technique).
D'AILLEURS getClass().getClassLoader().getResourceAsStream("/img/bg.png")
- que j'ai essayé en premier - m'a renvoyé un InputStream nul.
Dans Netbeans 8.1, ce que j'ai fait est d'inclure le dossier d'icônes et autres images appelé Ressources à l'intérieur de src dossier dans le fichier de projet.Alors chaque fois que je construis Pot fichier, le dossier y est inclus. L'arborescence des fichiers devrait ressembler à ceci :
- src (les fichiers Java dans les paquets sources sont ici)
** FORFAIT QUE VOUS AVEZ NOMMÉ DANS LE PROJET**
- fichier.java
Ressources
- image.jpg
Le code devrait ressembler à :
jToggleButton1.setIcon(new javax.swing.ImageIcon(this.getClass().getResource("/resources/image.jpg")));
Charger l'image à partir du fichier Jar pendant l'exécution est identique au chargement de l'image lorsqu'elle est exécutée à partir de l'EDI, par exemple Netbeans. La différence est que lors du chargement de l'image à partir du fichier JAR, le chemin doit être correct et son sensible aux majuscules et minuscules (très important).Cela fonctionne pour moi
image1 = new javax.swing.ImageIcon(getClass().getResource("/Pictures/firstgame/habitat1.jpg")); img = image1.getImage().getScaledInstance(lblhabitat1.getWidth(), lblhabitat1.getHeight(), Image.SCALE_SMOOTH); lblhabitat1.setIcon(new ImageIcon(img));
si p dans "/Pictures/firstgame/habitat1.jpg" est en minuscule, cela ne fonctionnera pas.vérifier les espaces, la casse et l'orthographe