Chargement des ressources à l'aide de getClass().getResource()
Je suis en train de charger une image à utiliser comme icône dans mon application. La méthode appropriée en fonction de ce 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;
}
}
Donc, j'ai placé l'emplacement du fichier, et l'a transmis en tant que paramètre à cette fonction. Cela n'a pas fonctionné, c'est à dire imgURL était nulle. Quand j'ai essayé de créer le ImageIcon en passant dans le chemin d'accès de manière explicite:
ImageIcon icon = new ImageIcon(path,"My Icon Image");
Il fonctionnait très bien! Donc, l'application peut choisir l'image à partir d'un définies explicitement chemin, mais n'a pas pris l'image à l'aide de getResources(). Dans les deux cas, la valeur de la variable de chemin d'accès est le même. Pourquoi ne serait-il pas de travail? Comment sont les ressources trouvées par le chargeur de classe?
Grâce.
- Êtes-vous d'utiliser un IDE? Est l'IDE mis à copier les ressources en où les classes compilé pour?
- Où est l'image par rapport à la classe et à la racine du projet?
- Oui, je suis à l'aide d'Eclipse, et il n'était pas mis en place pour copier les ressources. Ont résolu. La classe est situé dans root/bin/<noms>/MyClass et les images se trouvent dans root/resources/images/myImage.gif Merci pour vos réponses.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez demander un chemin dans ce format:
Même les octets pour la création de classes de la mémoire de cette manière:
et
getResource
vous donnera une URL qui peut être utilisé pour récupérer unInputStream
.Mais... je vous recommande d'utiliser directement
getClass().getResourceAsStream(...)
avec le même argument, parce qu'elle renvoie directement à l'InputStream et ne pas avoir à vous soucier de la création d'un (probablement complexe) URL de l'objet, qui est de savoir comment créer le InputStream.En bref: essayez d'utiliser
getResourceAsStream
et certains constructeur deImageIcon
qui utilise unInputStream
comme un argument.Chargeurs de classes
Attention, si votre application a beaucoup de chargeurs de classes. Si vous disposez d'une simple application autonome (pas de serveurs ou complexes), vous ne devriez pas vous inquiéter. Je ne pense pas que c'est le cas prévu
ImageIcon
a été capable de le trouver.Edit: classpath
getResource
est—comme mattb dit—pour le chargement des ressources depuis le classpath (à partir de votre .jar ou répertoire de chemin de classe). Si vous groupez une app c'est agréable d'avoir complètement, de sorte que vous pouvez inclure le fichier d'icône à l'intérieur du pot de votre application et d'obtenir de cette façon.getClass().getResource(path)
charge les ressources du chemin de classe, et non pas à partir d'un chemin du système de fichiers.Comme un noobie j'ai été confondu par ce jusqu'à ce que j'ai réalisé que le "chemin" est le chemin d'accès relative à la MyClass.classe fichier du système de fichiers et pas les MyClass.java fichier. Mon IDE copie les ressources (comme xx.jpg, xx.xml) dans un répertoire local de l'MyClass.class. Par exemple, à l'intérieur d'un paquet répertoire appelé "target/classes/pkg. La classe-l'emplacement du fichier peut être différent selon les IDE et en fonction de la façon dont la construction est structuré pour votre application. Vous devez d'abord explorer le système de fichiers et rechercher l'emplacement de la MyClass.class fichier et le copié à l'emplacement de la ressource associée vous êtes à la recherche d'extraire. Ensuite, déterminer le chemin d'accès par rapport à la MyClass.class fichier et de l'écrire comme une chaîne de valeur avec des "points" et "slash".
Par exemple, voici comment je fais un app1.fichier fxml à la disposition de mon javafx application de laquelle le "MyClass.class" implicitement "Main.class". L'Main.java fichier est où cette ligne de ressources-code d'appel est contenu. Dans mon cas précis, les ressources sont copiés dans un emplacement au même niveau que la enfermant dossier du package. C'est: /target/classes/pkg/Main.class et /target/classes/app1.fxml. Donc, pour paraphraser...la référence relative "../app1.fxml" est "commencer à partir de Main.class, remonter d'un niveau de répertoire, maintenant vous pouvez voir la ressource".
Noter que dans cette chaîne de chemin "../app1.fxml", les deux premiers points de référence du répertoire renfermant Main.class et l'unique "." indique une extension de fichier à suivre. Après ces détails deviennent une seconde nature, vous permettra d'oublier pourquoi il était source de confusion.
getResource par exemple:
de sortie: