Chargement des ressources à l'aide de getClass().getResource()
j'essaie de charger une image pour l'utiliser comme icône dans mon application. La méthode appropriée selon ceci tutoriel est:
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;
}
}
ainsi, j'ai placé l'emplacement du fichier, et l'ai passé comme paramètre à cette fonction. Cela n'a pas fonctionné, i.e. imgURL était nul. Quand j'ai essayé de créer L'ImageIcon en passant explicitement dans le chemin:
ImageIcon icon = new ImageIcon(path,"My Icon Image");
ça a bien marché! Donc, l'application peut choisir l'image à partir d'un définies explicitement chemin, mais n'a pas récupéré l'image en utilisant getResources(). Dans les deux cas, la valeur de la variable path est la même. Pourquoi ne serait-il pas de travail? Comment sont les ressources trouvées par le chargeur de classe?
Merci.
4 réponses
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 sont trouvés de cette façon:
my.Class -> /my/Class.class
et getResource
vous donnera une URL qui peut être utilisé pour récupérer un InputStream
.
Mais... Je recommande d'utiliser directement getClass().getResourceAsStream(...)
avec le même argument, parce qu'il renvoie directement L'entrée et n'a pas à s'inquiéter de créer un objet URL (probablement complexe) qui doit savoir comment créer InputStream.
En bref: essayez d'utiliser getResourceAsStream
et un constructeur de ImageIcon
qui utilise un InputStream
comme argument.
chargeurs de classes
soyez prudent si votre application a beaucoup de classloaders. Si vous avez une application autonome simple (pas de serveurs ou des choses complexes) vous ne devriez pas vous inquiéter. Je ne pense pas que c'est le cas prévu ImageIcon
était capable de le trouver.
Edit: classpath
getResource
est-comme mattb le dit-pour charger des ressources à partir du chemin de classe (à partir de votre .jar ou répertoire de chemin de classe). Si vous regroupez une application, il est agréable d'avoir tout à fait, de sorte que vous pourriez inclure le fichier d'icône dans le pot de votre application et de l'obtenir de cette façon.
getClass().getResource(path)
charge des ressources à partir du chemin classpath, pas à partir d'un chemin du système de fichiers.