2010-02-26 3 views
16

J'essaie de charger une image à utiliser comme icône dans mon application. La méthode appropriée en fonction de ce tutorial est:Chargement des ressources en utilisant getClass(). GetResource()

protected ImageIcon createImageIcon(String path, String description) 
{ 
    java.net.URL imgURL = getClass().getResource(path); 
    if (imgURL != null) { 
     return new ImageIcon(imgURL, description); 
    } else { 
     System.err.println("Couldn't find file: " + path); 
     return null; 
    } 
} 

Donc, je placé l'emplacement du fichier, et il est passé en tant que paramètre à cette fonction. Cela n'a pas fonctionné, c'est-à-dire qu'imgURL était nul. Quand je l'ai essayé de créer ImageIcon en passant dans le chemin explicitement:

ImageIcon icon = new ImageIcon(path,"My Icon Image"); 

Il fonctionnait très bien! Ainsi, l'application peut ramasser l'image à partir d'un chemin explicitement défini, mais n'a pas récupéré l'image en utilisant getResources(). Dans les deux cas, la valeur de la variable de chemin est la même. Pourquoi ça ne marcherait pas? Comment les ressources sont-elles trouvées par le chargeur de classe?

Merci.

+2

Utilisez-vous un IDE? Est-ce que l'EDI est configuré pour copier les ressources là où les classes sont compilées? – z5h

+0

Où se situe l'image par rapport à la classe et à la racine du projet? – willcodejavaforfood

+0

Oui, j'utilise Eclipse, et il n'était pas configuré pour copier des ressources. J'ai réglé ça. La classe se trouve dans root/bin//MyClass et les images se trouvent dans root/resources/images/myImage.gif Merci pour vos réponses. – Luhar

Répondre

12

Vous pouvez demander un chemin dans ce format:

/package/path/to/the/resource.ext 

Même les octets pour créer les classes en mémoire se trouvent de cette façon:

my.Class -> /my/Class.class 

et getResource vous donnera une wich URL peut être utilisé pour récupérer un InputStream.

Mais ... Je recommande d'utiliser directement getClass().getResourceAsStream(...) avec le même argument, car il retourne directement l'InputStream et ne doit pas se soucier de créer un objet URL (probablement complexe) qui doit savoir comment créer le Flux d'entrée. En bref: essayez d'utiliser getResourceAsStream et un constructeur de ImageIcon qui utilise un inputtream comme argument.

classloaders

Attention si votre application a beaucoup classloaders. Si vous avez une application autonome simple (pas de serveurs ou de choses complexes), vous ne devriez pas vous inquiéter. Je ne pense pas que ce soit le cas à condition que ImageIcon soit capable de le trouver.

Edit: classpath

getResource est -comme MattB pour les ressources dit- chargement du classpath (à partir de votre .jar ou un répertoire classpath). Si vous regroupez une application, il est bon d'avoir tout à fait, de sorte que vous pouvez inclure le fichier d'icône dans le pot de votre application et l'obtenir de cette façon.

14

getClass().getResource(path) charge les ressources à partir du chemin de classe, pas à partir d'un chemin de système de fichiers.

+0

lol! Je supposais qu'il avait le classpath pas le chemin de fichier. Je vais corriger ma réponse. – helios

3

En tant que noobie j'étais confus par ce que je compris que le soi-disant « chemin » est le chemin relatif au MyClass. classe fichier dans le système de fichiers et non le MyClass. fichier java. Mon IDE copie les ressources (comme xx.jpg, xx.xml) dans un répertoire local de MyClass.class. Par exemple, dans un répertoire pkg appelé "target/classes/pkg" L'emplacement du fichier de classe peut être différent pour les différents IDE et selon la structure de la construction pour votre application.Vous devez d'abord explorer le système de fichiers et trouver l'emplacement le fichier MyClass.class et l'emplacement copié de la ressource associée que vous cherchez à extraire.Ensuite, déterminez le chemin relatif au fichier MyClass.class et écrivez-le comme une valeur de chaîne avec "dots" et "slashes".

Par exemple, voici comment je mets un fichier app1.fxml à la disposition de mon application javafx où la classe "MyClass.class" est implicitement "Main.class". Le fichier Main.java est l'endroit où cette ligne de code d'appel de ressources est contenue. Dans mon cas spécifique, les ressources sont copiées dans un emplacement au même niveau que le dossier de paquetage englobant. C'est-à-dire: /target/classes/pkg/Main.class et /target/classes/app1.fxml. Donc paraphrasant ... la référence relative "../app1.fxml" est "commence par Main.class, monte d'un niveau de répertoire, maintenant vous pouvez voir la ressource".

FXMLLoader loader = new FXMLLoader(); 
     loader.setLocation(getClass().getResource("../app1.fxml")); 

Notez que dans cette chaîne de chemin relatif « ../app1.fxml », les deux premiers points de référence le répertoire renfermant Main.class et le single « » indique une extension de fichier à suivre. Après que ces détails soient devenus une seconde nature, vous oublierez pourquoi c'était déroutant.

Questions connexes