# Pfadangabe mit getResource



## Guest (29. Jan 2009)

Hi Jungs,

ich habe folgendes Problem und stecke einfach fest.

Ich versuche mittels URL url = getClass().getResource("resources/images/img.png"); ein URL auf ein Image zu erstellen um es mittels ImageIO einzulsen.

Allerdings ist url immer null.

Ich habe in Eclipse folgende Ordnerstruktur:

/
/src
/src/resources/
/src/resources/images/
/bin
/bin/resources/
/bin/resources/images/

Das Bild liegt definitiv im richtigen Ordner. Schreibfehler kann ich ausschließen. Ich Doktor hier schon 2 Stunden rum ... 

Jemand eine Idee?


----------



## SlaterB (29. Jan 2009)

liegt die Klasse in einem Unterpackage?


----------



## Gast (29. Jan 2009)

Ja,

die Klasse die versucht die Resource zu laden liegt im package:

de.test.up

Was müsste ich dann anpassen?


----------



## SlaterB (29. Jan 2009)

getClass().getResource("../../../resources/images/img.png");



> /**
> * Finds a resource with a given name.  The rules for searching resources
> * associated with a given class are implemented by the defining
> * {@linkplain ClassLoader class loader} of the class.  This method
> ...


----------



## Ebenius (29. Jan 2009)

SlaterB hat gesagt.:
			
		

> getClass().getResource("../../../resources/images/img.png");


Das stimmt zwar, ich empfehle trotzdem ─ um Verwirrungen vorzubeugen ─, entweder "resources" oder in "resources/images" eine Klasse hinzulegen, die die Bilder laden kann. Später ist es leichter, Abhängigkeiten zu Resourcen zu finden. Zum Beispiel: 
	
	
	
	





```
package resources.images;

public final class ImageResourceLoader {
  public static Icon loadIcon() {
    ...
  }
  ...
}
```

Ebenius


----------



## ChrisPZV (22. Okt 2009)

Auch wenn es schon eine Weile her ist, traue ich mich mal, bei dem thema ein wenig nachzuhaken.
Ich schalge mich selbst mit dem Problem herum, Bilder (ImageIcons) direkt aus dem *.jar-file zu laden.
Das habe ich nun ebenso wie der Threadstarter wahrscheinlich damals auch, einen haufen Möglichkeiten (verschiedene Pfadangaben wie "./images/icon.png", "/images/icon.png" oder "images/icon.png") probiert, immer mit dem selben, höchst merkwürdigen, Symptom:

Das *.jar-file wird mit korrekter Packages-Struktur erstellt.
Starten des Programms unter Eclipse lädt ordenlich ein Bild für den Splash und ein Icon für die Titelleiste.
Unter Linux (Ubuntu 9.04) klappt das ebenso. (Variante mit "images/icon.png")
Unter Windows XP SP3 klappt das laden nicht, die url wird null:


```
url = ClassLoader.getSystemResource("images"+File.separatorChar+"icon.png");
Icon splashImage = new ImageIcon(url);
splashImage.paintIcon(this, g, 0, 0);
```

Was ich bis dato noch nicht probiert habe, ist der Weg mit einer Klasse ImageResourceLoader, wie ich es eben hier gefunden habe.
Also schnell der Versuch:
[java=7]public final class ImageResourceLoader {
	public static ImageIcon loadImageIcon(String _imageName) {
		Object dummy = new Object();
		URL url = dummy.getClass().getClassLoader().getResource(_imageName);
		return new ImageIcon(url);
	}
}[/code](die Klasse befindet sich direkt im Package mit den zu ladenden Bildern.)

Das klappt natürlich  so auch nicht, die JVM springt mit einer NullPointerException in Zeile 10 ins Leere.

Wie genau müsste die Methode loadImageIcon aussehen oder was läuft/lief bei meinen anderen Versuchen schief?

Danke schon mal fürs lange Lesen!

Gruß
Christian


----------



## mvitz (22. Okt 2009)

Bei Variante 1 könnte es an File.separatorChar liegen, anstelle einfach ein / benutzen (funzt bei Java OS unabhängig)

Für Variante 2 anstelle des Dummy Objekts ImageResourceLoader.class.getClassLoader().getResource()


----------



## ChrisPZV (23. Okt 2009)

zu Variante1: Eine Änderung von 'File.seperatorChar' nach '"/"' ändert leider nichts am (schlechten) Ergebnis. (Meistens benutze ich auch nur '"/"', schon allein deswegen, weil es schneller getippt ist...)
zu Variante2: (die Factory befindet sich im selben package wie die Bildchen selbst.
[java=7]public final class ImageLoaderFactory {
	public static ImageIcon loadImageIcon(String _imageName) {
		return new ImageIcon(_imageName);
	}
}[/code]...und der Aufruf dazu:
	
	
	
	





```
setIconImage(ImageLoaderFactory.loadImageIcon("icon.png").getImage());
```
Dadurch umgehe ich die URL, wodurch das Programm zumindest nicht an einer NullPointerException scheitert aber dennoch bleibt der gewünschte Effekt aus. Auch unter Linux wird so nicht mehr mein eigenes Titel-Icon mehr angezeigt. :noe:

Noch Vorschläge?

hoffnungsvoll
Christian

[edit]
Nach weiteren Experimenten habe ich doch noch die Lösung gefunden:
Im root des *.jar-files befindet sich eine package-Struktur mit Bildern, z.B.: lib/images/icon.png. Die Klasse ImageLoaderFactory liegt in lib/ImageLoaderFactory.java und sieht wie folgt aus:
	
	
	
	





```
mein Code sieht nun wie folgt aus:package lib;

import java.net.URL;

import javax.swing.ImageIcon;

public final class ImageLoaderFactory {
	public final static String imagesPath = "lib/images/";
	public static ImageIcon loadImageIcon(String _imageName) throws NullPointerException{
		URL url = ImageLoaderFactory.class.getClassLoader().getResource(imagesPath+_imageName);
		if (url != null){
			return new ImageIcon(url);
		} else {
			throw new NullPointerException();
		}
	}
}
```
Der (gesicherte) Aufruf lautet damit wie folgt:
	
	
	
	





```
try{
	setIconImage(ImageLoaderFactory.loadImageIcon("icon.png").getImage());
} catch(NullPointerException e){
	// show title icon if image can be found in classpath/file system only 
}
```
Voila, das Icon wird geladen, sowohl beim Aufruf unter Eclipse, als auch beim Starten des *.jar-files unter Windows oder Linux.
Entscheidend ist wohl der imagePath, den man Relativ zum root des *.jar-files angeben muss in Kombination(!) mit der Factory, die sich gewissermaßen auf dem gleichen Weg befinden muss.
Danke euch für die Zaunpfähle!
[/edit]


----------

