# ImageIcon - Probleme mit dem Dateipfad



## Bolic (24. Jan 2013)

Guten Abend,

ich bin kurz vor dem absoluten verzweifeln, doch ich weiß nicht was mein Fehler ist.


```
public Component printKarten(String kartenFarbe, String kartenName) {
		ImageIcon icon = new ImageIcon("C:\\Dropbox\\WORKSPACE\\Kartenspiele\\src\\BlackJack\\kartenbilder\\"+kartenFarbe+kartenName+".jpg");
		icon.setImage(icon.getImage().getScaledInstance(100,100, Image.SCALE_DEFAULT));
		labelKarten = new JLabel(icon);
		return labelKarten;
	}
```

Ich habe mir also eine Methode gebastelt, die mir die passenden Bilder zu den Spielkarten ausgeben soll. Mein Problem liegt im Dateipfad. Denn ein Bild wird NUR angezeigt, wenn ich wirklich den Pfad von c: aus angebe. Ich würde aber gerne nur kartenbilder\name.jpg nutzen! In der API steht das übrigens genau so, führt aber zu keinem Effekt.

Vielen Dank für eure Antworte und nen schönen Abend noch 

Grüße Bolic


----------



## L-ectron-X (24. Jan 2013)

Vielleicht hilft dir das:
Grafikdateien laden und anzeigen ? Byte-Welt Wiki
Da gibt es einige konkrete Beispiele zum relativen Einbinden von Bildern.


----------



## Bolic (25. Jan 2013)

Danke für die schnelle Antwort und den Link.

Bin die Seite mal durchgegangen und habe eigentlich alle Varianten mal ausprobiert. Aber irgendwie funktioniert das nicht. Dort steht auch wieder, dass man den Dateipfad als String einfach angeben kann:

Wäre bei mir also

```
ImageIcon icon = new ImageIcon("kartenbilder\\"+kartenFarbe+kartenName+".jpg");
```

Habe auch ein paar Möglichkeiten ausprobiert. Mal ein '/' benutzt. Oder vor kartenbilder auch noch ein Slash oder zwei Blackslahes. Irgendwie tuts das alles nicht. Nur wenn ich es, wie oben gezeigt angebe.

Tut das was zur Sache, dass ich auf einem win8 Rechner das mache? Wahrscheinlich nicht...

Sollte ich das Problem vielleicht direkt mit was anderem und nicht einem IconImage angehen? Nur wie kann ich das dann einem Label hinzufügen? Kann mich auch anfreunden was anderes als ein Label zu benutzen.

Ziel ist es, bzw bisher so gedacht: Ich habe ein Label, was mit in das UI eingebunden ist und mit dem Aufruf:


```
panelKarten.add(printKarten(karte.getKartenFarbe(),karte.getKartenName()));
```

soll dann die Methode aufgerufen werden, wodurch das Bild der Spielkarte direkt dem Label, also dem UI hinzugefügt werden soll. Hier nochmal die Methode:


```
public Component printKarten(String kartenFarbe, String kartenName) {
		ImageIcon icon = new ImageIcon("C:\\Dropbox\\WORKSPACE\\Kartenspiele\\src\\BlackJack\\kartenbilder\\"+kartenFarbe+kartenName+".jpg");
		icon.setImage(icon.getImage().getScaledInstance(100,100, Image.SCALE_DEFAULT));
		labelKarten = new JLabel(icon);
		return labelKarten;
	}
```

Will dort eben nicht abhängig davon sein, wo die Dateien liegen. Sprich dass C:\\Dropbox\\WORKSPACE\\Kartenspiele\\src\\BlackJack\\ nicht mehr da stehen muss.
Später will ich das ganze vielleicht noch in eine jardatei packen, damit man das eben einfach so starten kann.

Help me pleas 

Vielen Dank für eure Mühen 

Grüße Bolic


----------



## L-ectron-X (25. Jan 2013)

Warum später?
Schreibe deinen Code gleich so, dass er auch für die Referenzierung der Bilder in Jar-Dateien genügt.
Im obigen Link findest du dazu Anweisungen in denen 
	
	
	
	





```
getClass().getResource(...)
```
 verwendet wird. Das solltest du benutzen.
ImageIcon ist für die Verwendung in einem JLabel schon die beste Wahl.

Zu den Backslashes: Ich finde das eine unschöne Sache, Backslashes zu verwenden, weil sich diese auf die Windows-Plattform ausrichten. Das gleiche Programm wird unter Linux nicht mehr funktionieren, auch wenn du keine Laufwerksangaben im Pfad haben solltest. Das Beste ist daher, nur Slashes zu nutzen.


----------



## Bolic (25. Jan 2013)

Ah, perfekt. Danke. Mit dem Tipp hab ich es nun.

Das Problem mit dem Dateipfad im ImageIcon ist nun zwar nicht gelöst, aber ich habe nun die Jar-File erstellt und es wie folgt gelöst.


```
public Component printKarten(String kartenFarbe, String kartenName) {
		try {
			image = ImageIO.read(getClass().getResource("/Kartenspiele/src/BlackJack/kartenbilder/"+kartenFarbe+kartenName+".jpg"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ImageIcon icon = new ImageIcon(image);
		icon.setImage(icon.getImage().getScaledInstance(100,100, Image.SCALE_DEFAULT));
		labelKarten = new JLabel(icon);
		return labelKarten;
	}
```

So habe ich nun ne nette Jar-File, in der alles funktioniert  Danke dir


----------



## Bolic (25. Jan 2013)

So wie ich das gerade geschrieben habe stimmts nicht ganz. Für die Korrektheit, falls jemand den Thread mal liest:

Meine Struktur in der Jar-File sieht wie folgt aus: (Aus dem "Kartenspiel" mache ich eine Jar-File.)






Dann muss es wie folgt aussehen:


```
image = ImageIO.read(getClass().getResource("/BlackJack/kartenbilder/"+kartenFarbe+kartenName+".jpg"));
```


----------

