# .jar findet ImageIcon nicht



## Q-Dog (27. Jun 2010)

Guten Morgen,

ich habe folgendes Problem und zwar findet meine .jar Datei die ImageIcons nicht.
In Eclipse funktioniert allerdings alles einwandfrei.

Ich binde die ImageIcons wie folgt ein:

```
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("../../gfx/gui/hauptmenu/spielmenu_hintergrund.png"));
```

Ich hab jetzt schon ne Weile nach Lösungen gesucht aber nichts gefunden.
Ich vermute, dass .jar mit dem "../" nicht klarkommt, wüsste aber nicht wie ich dies umgehen könnte.

Ich hoffe ihr könnt mir helfen.


Liebe Grüße,
Q-Dog


----------



## L-ectron-X (27. Jun 2010)

Das sollte kein Problem sein. Zeig mal bitte die Verzeichnisstruktur in deiner Jar-Datei.
Interessant wäre auch die Fehlermeldung, die der Interpreter ausgibt, wenn du die Jar-Datei mal mit 
	
	
	
	





```
java -jar DeinJar.jar
```
 startest.


----------



## Q-Dog (27. Jun 2010)

Hallo L-ectron-X, vielen Dank schonmal für deine Antwort.

Die Fehlermeldung ist:

```
java -jar Texas.jar
Exception in thread "main" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:167)
	at spiel.menue.Hauptmenue.<init>(Hauptmenue.java:32)
	at Texas_Codeem.main(Texas_Codeem.java:20)
```

Wie gesagt er findet die Bilder nicht.


Die Verzeichnisstruktur ist die Folgende

```
src 
 |- main (Klasse mit Main-Methode)
 |- spiel
     |- ablauf
     |- auswertung
     |- menu (hier ist das Hauptmenue von oben)
 |- gfx
     |- gui
         |- hauptmenu (Bilder)
         |- karten (Bilder)
         |- tisch (Bilder)
```

Sprich aus dem menu muss man 2 Ordner hoch, dann in gfx/gui/hauptmenu/*.png

In Eclipse selbst funktionierts ja auch.

Gruß Q-Dog


----------



## Guest2 (27. Jun 2010)

Moin,

versuch mal:


```
final ImageIcon hintergrundIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("gfx/gui/hauptmenu/spielmenu_hintergrund.png")));
```

Gruß,
Fancy


----------



## Q-Dog (27. Jun 2010)

Hallo,

da meckert er schon beim compilieren rum :bahnhof:


----------



## Guest2 (27. Jun 2010)

Kann ich mir nicht vorstellen 

Was sagt er den?

Gruß,
Fancy


----------



## Q-Dog (27. Jun 2010)

na in eclipse isses rot unterkringelt (obwohl ich ImageIO importiert habe) und wenn ich auf den Hinweis klicke "Nothing to suggest"


----------



## Guest2 (27. Jun 2010)

Hm, das ImageIO.read() kann ne IOException werfen. Dazu sollte Eclipse Dir aber Lösungen zeigen können. Wenn es daran liegt, entweder per throws IOException weiterreichen, oder:


```
ImageIcon hintergrundIcon;
        
        try {
            
            hintergrundIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("gfx/gui/hauptmenu/spielmenu_hintergrund.png")));
            
        } catch (IOException e) {
            
            e.printStackTrace();
            
        }
```

Ansonsten zeig doch mal die komplette Methode, in der das geladen wird.

Gruß,
Fancy


----------



## Q-Dog (27. Jun 2010)

Ah stimmt lag an der Exception, danke 

Allerdings löst es das Problem nicht, das Bild wird nun gar nicht angezeigt, weder in Eclipse noch in der .jar.


----------



## Guest2 (27. Jun 2010)

Wenn es nicht angezeigt wird, sollte vorher die Exception fliegen. Und die gibt den Stacktrace aus. Was wird den da ausgegeben?

Und bist Du sicher, dass die Pfade stimmen? (Beim Weg über den ClassLoader kommen keine ../../ davor)

Gruß,
Fancy


----------



## Q-Dog (28. Jun 2010)

Ne also ne Exception fliegt komischerweise nicht.

Das Bild wird gefunden, nur irgendwie nicht angezeigt (hab sonst nichts verändert).
Und bei der Pfadangabe hab ich das "../../" weggelassen.


----------



## L-ectron-X (28. Jun 2010)

Wenn ich nichts übersehen habe, sollte es so funktionieren:

```
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("../gfx/gui/hauptmenu/spielmenu_hintergrund.png"));
```
oder so:

```
ImageIcon hintergrundIcon = new ImageIcon(Hauptmenue.class.getResource("../gfx/gui/hauptmenu/spielmenu_hintergrund.png"));
```


----------



## Q-Dog (28. Jun 2010)

aber warum denn nur einen Pfad hoch?

Man muss ja aus Spiel/Menu/ in den src-Ordner hoch und das wäre doch "../../".


----------



## Guest2 (28. Jun 2010)

Sieh Dir mal dieses Beispiel an: http://too-late.de/kskb/ImageIcon.zip 

Das ist ein vollständiges Eclipse Project, mit genau Deiner Verzeichnisstruktur und dem von mir gezeigtem Code. Und es geht 

Gruß,
Fancy


----------



## slawaweis (28. Jun 2010)

eine Klasse hat "Package + Name" als vollständigen Namen. So ist z.B. "org.xyz.MyClass" der Namen der Klasse und nicht "MyClass". Wenn man also relative Grafiken laden will, müssen diese relativ zum Klassenamen liegen, was in diesem Fall das wäre:


```
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("/gfx/gui/hauptmenu/spielmenu_hintergrund.png"));
```

Alternativ würde auch das gehen:


```
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("gfx/gui/hauptmenu/spielmenu_hintergrund.png"));
```

Slawa


----------



## Q-Dog (28. Jun 2010)

slawaweis hat gesagt.:


> eine Klasse hat "Package + Name" als vollständigen Namen. So ist z.B. "org.xyz.MyClass" der Namen der Klasse und nicht "MyClass". Wenn man also relative Grafiken laden will, müssen diese relativ zum Klassenamen liegen, was in diesem Fall das wäre:
> 
> 
> ```
> ...



Ja genau so hab ich nun auch alles umgebaut.
Sprich den gfx Ordner aufgesplittet und in Unterverzeichnisse der Packages gepackt.

@Guest2
Mom ich schau mal ^^

//edit
Ja tatsächlich, das funktioniert!
Das ist ja mehr als komisch.

Naja hab das Projekt nun wie oben beschrieben einfach umgebaut.

Nochmals vielen Dank euch allen für eure Mühe.


----------



## coree (28. Jun 2010)

Da ich für das gleiche Problem keinen neuen Thread öffnen will, schreib ich das einfach mal hiermit hinzu.

ich hab jetzt schon den ganzen Tag gesucht und bisher keine funktionierende Lösung gefunden. Auch hab ich

```
try {

            ImageIcon openIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("../images/tree_open.jpg")));
            ImageIcon closedIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("../images/tree_close.jpg")));
            ImageIcon leafIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("../images/file_music.png")));
            renderer.setOpenIcon(openIcon);
            renderer.setClosedIcon(closedIcon);
            renderer.setLeafIcon(leafIcon);
            tree.setCellRenderer(renderer);

        } catch (IOException e) {

            e.printStackTrace();

        }
```
probiert. Aber funktioniert hat auch dies nicht.

Meine Struktur sieht wie folgt aus:


```
gui
|- gui
    |- images
    |- sammlungtable
```
Der angegeben Code kommt aus einer Klasse, die sich im sammlungtable-Package befindet. 
Bilder werden bisher nur dann angezeigt, wenn die Klasse direkt im gui-Package ist.

Was mache ich falsch und wie kann ich das Problem lösen? Danke schonmal

edit: habs jetzt gelöst. hab nun auch noch die packages angegeben, die überhalb von gui sind.


----------

