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.

18
demandé sur Luhar 2010-02-26 19:42:50

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.

13
répondu helios 2018-04-10 01:21:25

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

15
répondu matt b 2010-02-26 16:48:31

en tant que noobie, j'étais confus jusqu'à ce que je réalise que le soi-disant "chemin" est le chemin relative