# Problem mit ImageIcons in einem Jar-File



## Boar (19. Aug 2006)

Hi,

ich programmiere mit Eclipse und erstelle auch meine Jar-Files mit Eclipse. So, letztens hatte ich in einem Programm ein JPanel mit Hintergrundbild, das Ganze hat mit folgendem Code auch hervorragend funktioniert:


```
public class MeineKlasse extends JPanel {
	private URL url;
	private Image spielfeld;
	
	public MeineKlasse() {
		url = ClassLoader.getSystemResource("Images/Spielfeld.jpg");
		spielfeld = Toolkit.getDefaultToolkit().getImage(url);
	}
	
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage( spielfeld, 0, 0, this );
	}
}
```

Den Ordner Images hab ich nachträglich ins Jar gepackt (Das von Eclipse erstellte Jar entpackt und mit dem Images-Ordner und dem entpackten Jar ein neues Zip-File erstellt und in .jar umbenannt), weil ich noch nicht rausgefunden habe, wie ich den Ordner mit Eclipse direkt zum Jar-File hinzufügen kann. (Vielleicht hat da ja auch jmd. ein Tipp für mich) 

Nun zum eigentlichen Problem: 
In meinem aktuellen Programm (Vier Gewinnt) hab ich das Spielfeld mit nem JLabel[][]-Array realisiert und will die Spielsteine per ImageIcon auf dem JLabel anzeigen. In Eclipse funktioniert das auch so wie gewollt, im Jar-File allerdings nicht. Hier der Code-Ausschnitt:


```
public class VGSpielfeld extends JPanel {
	
	private JLabel[][] feld;
	private Image img;
	private URL url;
	private ImageIcon feldRot, feldGelb, feldLeer, winRot, winGelb;
	
	public VGSpielfeld(VGBoard board) {
		setPreferredSize(new Dimension(350,300));
		setLayout(new GridLayout(6,7));
		
		feld = new JLabel[6][7];
			
		url = ClassLoader.getSystemResource( "img/feld_leer.jpg" );
		img = Toolkit.getDefaultToolkit().getImage(url);
		feldLeer = new ImageIcon(img);
		url = ClassLoader.getSystemResource( "img/feld_rot.jpg" );
		img = Toolkit.getDefaultToolkit().getImage(url);
		feldRot = new ImageIcon(img);
		url = ClassLoader.getSystemResource( "img/feld_gelb.jpg" );
		img = Toolkit.getDefaultToolkit().getImage(url);
		feldGelb = new ImageIcon(img);
		url = ClassLoader.getSystemResource( "img/win_rot.jpg" );
		img = Toolkit.getDefaultToolkit().getImage(url);
		winRot = new ImageIcon(img);
		url = ClassLoader.getSystemResource( "img/win_gelb.jpg" );
		img = Toolkit.getDefaultToolkit().getImage(url);
		winGelb = new ImageIcon(img);
		
		for(int i=0; i<6; i++)
        {
            for(int j=0; j<7; j++)
            {
                feld[i][j] = new JLabel(feldLeer,JLabel.CENTER);
                feld[i][j].setBorder(new LineBorder(Color.black,1));
                add(feld[i][j]);
                feld[i][j].setOpaque(true);
            }
        }	
		
		setBackground(Color.WHITE);
	}
```

Das Jar-File hab ich so erstellt wie oben erklärt. Wenn ich es per Doppelklick starte tut sich scheinbar nichts, aber im Taskmanager wird der Prozess javaw.exe gestartet, aber es wird nichts angezeigt. Das Problem kann nur an den Bildern liegen, da ohne die Bilder (Da hab ich die Spielsteine über feld_[j].setText("X"); realisiert) auch das Jar-File keine Probleme macht.

Danke für die Hilfe!

Gruß,
Boar_


----------



## Wildcard (19. Aug 2006)

```
ClassLoader.getSystemResource("/img/win_gelb.jpg");
```
Sofern das dem Pfad im Jar entspricht.


----------



## Boar (19. Aug 2006)

> ```
> ClassLoader.getSystemResource("/img/win_gelb.jpg");
> ```
> 
> Sofern das dem Pfad im Jar entspricht.



Danke, dass du dich meinen Problem annimmst.

Ja, der Pfad entspricht dem Pfad im Jar.

Nach der Änderung krieg ich beim starten in Eclipse folgenden Error:


```
Uncaught error fetching image: java.lang.NullPointerException
	at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:97)
	at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:106)
	at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
	at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
	at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
```

Das Jar funktioniert aber immer noch nicht, selbes Problem wie vorher.  

EDIT: Sorry für den Doppelpost, kann den bitte einer löschen? Danke


----------



## Boar (19. Aug 2006)

> ```
> ClassLoader.getSystemResource("/img/win_gelb.jpg");
> ```
> 
> Sofern das dem Pfad im Jar entspricht.



Danke, dass du dich meinen Problem annimmst.

Ja, der Pfad entspricht dem Pfad im Jar.

Nach der Änderung krieg ich beim starten in Eclipse folgenden Error:


```
Uncaught error fetching image: java.lang.NullPointerException
	at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:97)
	at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:106)
	at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
	at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
	at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
```

Das Jar funktioniert aber immer noch nicht, selbes Problem wie vorher.


----------



## Wildcard (19. Aug 2006)

Gibt bitte mal die genaue Ordnerstruktur des jars an, oder lade es irgendwo hoch.


----------



## Boar (19. Aug 2006)

VierGewinnt.jar
--- Ordner control --- Klasse VGController
--- Ordner game --- Klasse VGBoard, VGComputer, VGRules
--- Ordner view --- Klasse VGView, VGSpielfeld
--- Ordner META-INF --- Datei manifest.mf
--- Ordner img --- Enthält jpg-Bilder
--- Datei .classpath, .project

Den Ordner img hab ich zum testen auch schon mit in den Ordner view gepackt, hilft auch nix.


----------



## Wildcard (19. Aug 2006)

Hast du auch dran gedacht den '/' bei *jedem* Bild hinzuzufügen und das jar neu erstellt?


----------



## Boar (19. Aug 2006)

Ja, hab ich gemacht... ich versteh das net. Wahrscheinlich ein sau blöder Fehler, aber ich komm einfach net drauf.


EDIT: Grml, Problem gelöst. Ich hab mir den Ordner img nochmal angeschaut, dort sind alle Endungen groß geschrieben, also *.JPG, in meinem Code steht aber *.jpg, deshalb gings net. Das Jar läuft aber nur, wenn ich den Pfad ohne den Slash am Anfang angebe, also so wie am Anfang.

Trotzdem Danke für deine Mühe!

Gruß, Boar


----------

