Pfadangabe mit getResource

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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?
 
G

Gast

Gast
Ja,

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

de.test.up

Was müsste ich dann anpassen?
 
S

SlaterB

Gast
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
* delegates to this object's class loader. If this object was loaded by
* the bootstrap class loader, the method delegates to {@link
* ClassLoader#getSystemResource}.
*
*

Before delegation, an absolute resource name is constructed from the
* given resource name using this algorithm:
*
* <ul>
*
* [*] If the <tt>name</tt> begins with a <tt>'/'</tt>
* (<tt>'\u002f'</tt>), then the absolute name of the resource is the
* portion of the <tt>name</tt> following the <tt>'/'</tt>.
*
* [*] Otherwise, the absolute name is of the following form:
*
* <blockquote><pre>
* <tt>modified_package_name</tt>/<tt>name</tt>
* </pre></blockquote>
*
*

Where the <tt>modified_package_name</tt> is the package name of this
* object with <tt>'/'</tt> substituted for <tt>'.'</tt>
* (<tt>'\u002e'</tt>).
*
* [/list]
*
* @param name name of the desired resource
* @return A {@link java.net.URL} object or <tt>null</tt> if no
* resource with this name is found
* @since JDK1.1
*/
 

Ebenius

Top Contributor
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:
Code:
package resources.images;

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

Ebenius
 

ChrisPZV

Neues Mitglied
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:
Java:
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

Top Contributor
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

Neues Mitglied
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:
Java:
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:
Java:
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:
Java:
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]
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben