Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
/**
* 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
*/
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() {
...
}
...
}
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:
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?
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:
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]