web-dev-qa-db-fra.com

Charger l'image Java à l'intérieur du package à partir d'une classe dans un package différent

J'ai un projet Java appelé MyProject. J'ai quelques paquets différents (garder les noms simples pour les besoins de cette question), comme suit:

src/PackageA
src/PackageA/PackageAa
src/PackageA/PackageAa/PackageAaa
src/PackageB
src/PackageB/PackageBa
src/PackageB/PackageBa/PackageBaa

J'ai un cours

src/PackageA/PackageAa/PackageAaa/MyJavaFile.Java

Et j'ai une image

src/PackageB/PackageBa/PackageBaa/MyImage.png

À l'intérieur de MyJavaFile.Java, j'aimerais déclarer un objet Image de MyImage.png

Image img = new Image(....what goes here?...)

Comment puis-je faire ceci?

12
CodeGuy

Vous pouvez appeler Class.getResource et spécifier un chemin commençant par / ou ClassLoader.getResource et ne pas déranger avec le /:

URL resource = MyJavaFile.class
      .getResource("/PackageB/PackageBa/PackageBaa/MyImage.png");

ou:

URL resource = MyJavaFile.class.getClassLoader()
      .getResource("PackageB/PackageBa/PackageBaa/MyImage.png");

En gros, Class.getResource vous permettra de spécifier une ressource par rapport à la classe, mais je ne pense pas que vous permette d'utiliser ".." etc. pour la navigation dans les répertoires.

Bien sûr, si vous connaissez une classe dans le bon package, vous pouvez simplement utiliser:

URL resource = SomeClassInPackageBaa.class.getResource("MyImage.png");

(Je suppose que vous pouvez passer un URL au constructeur Image en question. Il existe également getResourceAsStream à la fois sur Class et ClassLoader.)

14
Jon Skeet

vous pouvez utiliser le chemin relatif puisque le chemin relatif est le dossier du projet.

 ImageIcon img = new ImageIcon("src/PackageB/PackageBa/PackageBaa/MyImage.png");
4
mohamed abdallah

/folderB/folderBa/folderBaa/MyImage.png

l’image peut être stockée dans le dossier du projet .eg: /images/MyImage.png

alors vous l'essayez

Image img = new Image(/images/MyImage.png);

L'utilisation d'un chemin de fichier n'est pas possible lors de l'exécution d'un programme contenu dans un fichier jar, en particulier si le programme est chargé en tant qu'applet ou application WebStart, vous pouvez utiliser ClassLoader pour obtenir une image.

utilisez le code suivant pour charger les images:

 ClassLoader cldr = this.getClass().getClassLoader();

    Java.net.URL imageURL   = cldr.getResource("/PackageB/PackageBa/PackageBaa/MyImage.png");
ImageIcon aceOfDiamonds = new ImageIcon(imageURL);
2
Mohammod Hossain

Ceci IS le meilleur moyen de gérer toutes les images et les icônes d'une application JAR.

Une fois que vous avez compressé toutes vos images et icônes dans son propre fichier JAR - Configurez votre chemin de construction en ajoutant le fichier JAR des images dans l'onglet Bibliothèques de sorte qu'il soit maintenant inclus dans votre chemin de classe.

Ensuite, utilisez simplement les 3x lignes de code au début de votre constuctor pour accéder à toute image dont vous avez besoin, y compris une image SystemTray qui n'accepte pas le simple ImageIcon comme son icône principale (bizarre, je sais). Les lignes 3x sont:

  URL iconUrl = this.getClass().getResource("/image-iconb.png");
  Toolkit tk = this.getToolkit();
  imageIcon = tk.getImage(iconUrl);

(imageIcon est juste un constructeur déclaré variable Image) Vous pouvez maintenant définir une icône de fenêtre aussi simplement:

setIconImage(imageIcon );

et utilisent simultanément la même variable pour définir System TrayIcon en déclarant:

 trayIcon = new TrayIcon(imageIcon, "SystemTray Demo", popupMenu);

Ce qui précède vous permet de déclarer des images ou des images facilement et de manière centralisée sans courir le risque de ne pas conserver les ressources d'image au bon endroit. Il le garde bien en ordre, avec le JAR contenant toutes vos images automatiquement compilées au moment de l'exécution et de la distribution de votre programme.

En bonus , une fois que le fichier JAR est enregistré dans votre chemin de classe - vous pouvez continuer à ajouter d'autres images dans le même fichier JAR à tout moment sans difficulté - Tout fonctionne et les images ajoutées sont immédiatement disponibles pour votre application.

Beaucoup mieux à mon avis.

1

Utilisez la méthode getResource pour lire les ressources à la racine de src. Par exemple, le code suivant récupère les images d'un dossier src/images.

// Get current classloader
ClassLoader cl = this.getClass().getClassLoader();
// Create icons
Icon saveIcon  = new ImageIcon(cl.getResource("images/save.gif"));
Icon cutIcon   = new ImageIcon(cl.getResource("images/cut.gif"));

L'exemple suppose que les entrées suivantes existent dans le fichier JAR de l'application:

images/save.gif
images/cut.gif
0
Lazy Coder