# Javaprogramm mit Bildern als .jar-Datei exportieren(in Eclipse)



## Mr. Q (2. Aug 2010)

Guten Tag,

ich habe ein Java Programm geschrieben, das mit Buttons arbeitet, die mit Bildern belegt sind. 
Das Programm funktioniert wunderbar und ich will es jetzt kompilieren, so dass ich nur noch eine .jar-Datei habe in der dann alles drin ist. Ich kann auch ein "Runnable JAR file" exportieren, das zeigt die Bilder aber nur auf meinem Rechner an weil der Pfad zu den Bildern absolut ist und die Bilder nicht mitexportiert werden.

Ich habe auch durchaus einige Beiträge zu diesem Thema gefunden, bin aber nicht ganz schlau draus geworden.

Situation:
Ich verwende Eclipse auf einem Linuxsystem.
So werden die Bilder momentan geladen:

```
ImageIcon spieler2 = new ImageIcon("/home/mrq/Desktop/JBilder/Cola.jpeg");
```

Verzeichnisstruktur:

```
Workspace
  '--Projektname
      '--bin
          '--Packetname
                '--Dateien.class
      '--src
          '--Packetname
                '--Dateien.java
```

Wo müssen die Bilddateien hin?
Wie müssen die Bilddateien geladen werden?


----------



## Volvagia (2. Aug 2010)

Benutze Class.getResource() oder Class.getResourceAsStream().
Die Bilder müssen, soweit ich mich errinnere im bin-Ordner. Aber mit ein wenig experimentieren wirst du schon alleine dahinter kommen.


----------



## Mr. Q (2. Aug 2010)

Danke erstmal für die schnelle Antwort.

Habe die Bilder mal nach "bin" zu Dateien.class verschoben

```
ImageIcon spieler2 = new ImageIcon(Class.getResource("Cola.jpeg"));
```
liefert:
"Multiple markers at this line
	- Cannot make a static reference to the non-static method getResource(String) from the type Class
	- Class is a raw type. References to generic type Class<T> should be parameterized"


```
ImageIcon spieler2 = new ImageIcon(Class.getResourceAsStream("Cola.jpeg"));
```
liefert:
"Multiple markers at this line
	- The constructor ImageIcon(InputStream) is undefined
	- Class is a raw type. References to generic type Class<T> should be parameterized
	- Cannot make a static reference to the non-static method getResourceAsStream(String) from the type 
	 Class"


----------



## Volvagia (2. Aug 2010)

Die beiden Methoden sind nicht static. Du musst dir allso eine Class-Instance besorgen. (getClass())
Und Class ist generisch, also gibst du am besten immer <?> an.

Sollte also in etwa so aussehen:


```
Class<?> aClass = new Object().getClass(); //"class" ist ein reservierter primitiver Typ!
URL imgUrl = aClass.getRessource("/Cola.jpeg");
ImageIcon spieler2 = new ImageIcon(imgUrl);
```

Statt einer neuen Object-Instance kannst (und solltest) du natürlich auch die Klasse der Instance der Methode verwenden. Wenn dus in einer statischen Methode ausführst brauchst du natürlich irgend eine andere Instance von der du dir eine Class hohlen kannst.


----------



## Mr. Q (2. Aug 2010)

ok, jetzt gibt es schon mal keine warnings und errors mehr, dafür aber eine Fehlermeldung:

"Exception in thread "main" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:155)
	at test.packet.XXOJButton.<init>(XXOJButton.java:23)
	at test.packet.View.<init>(View.java:44)
	at test.packet.Controller.main(Controller.java:9)"

und das habe ich ins Programm geschrieben(es handelt sich um 2 Bilder, daher leicht verändert):


```
Class<?> aClass = new Object().getClass(); //"class" ist ein reservierter primitiver Typ!
	URL aimgUrl = aClass.getResource("/Bionade.png");
	ImageIcon spieler1 = new ImageIcon(aimgUrl);        //Das ist XXOJButton, Zeile 23
	

	Class<?> bClass = new Object().getClass(); //"class" ist ein reservierter primitiver Typ!
	URL bimgUrl = bClass.getResource("/Cola.jpeg");
	ImageIcon spieler2 = new ImageIcon(bimgUrl);
```
Der Code steht in XXOJButton.java, die Zeile aus der Fehlermeldung habe ich oben eingetragen. Kann es sein, dass er das Bild nicht findet?


----------



## Tomate_Salat (2. Aug 2010)

Wo liegen den deine Bilder?

*Edit*
Ich hab hier mal im Anhang ein Beispiel mit sourcecode hinterlegt


----------



## Mr. Q (3. Aug 2010)

Die Bilder liegen wiefolgt:

workspace/Projektname/bin/Paketname/Cola.jpeg
workspace/Projektname/bin/Paketname/Bionade.jpeg

ich hab sie auch mal überall rumverschoben, das hat aber nichts gebracht.


Dein Beispielprogramm kann ich leider nicht ausführen. Ich habe es einmal nachgebaut und erhalte die gleiche Fehlermeldung wie bei meinem. Wo muss denn da das Bild abgelegt werden?


----------



## Tomate_Salat (3. Aug 2010)

leg mal die bilder in 
workspace/Projektname/*src*/Paketname/Bionade.jpeg

und rufe sie über den Pfad [c]/Paketname/BILDNAME.ENDUNG[/c]

MFG

Tomate_Salat


----------



## Mr. Q (3. Aug 2010)

So, es klappt jetzt irgendwie doch und nur wenn die Dateien im bin-Verzeichnis liegen.
Wahrscheinlich hab ich den Pfad bisher immer falsch gesetzt, vielen Dank für den Hinweis.

Ich kann das Projekt jetzt problemlos "runnen" d.h. testen und auch exportieren. Wenn ich die jar-Datei dann aber ausführbar mache und doppelklicke passiert nichts. Wenn ich das Label mit Text belege funktioniert es aber.
Außerdem enthält die jar-Datei keine Bilder so wie die Beispiel-Datei.

Wie exportiere ich das richtig?

Bisher mach ich das so:

File -> export...

"Select..." wird angezeigt
Java, "Runnable JAR file, next

Specification wird angezeigt
Launch Configuration-> das Projekt auswählen
Export destination -> Ort festlegen

Library handling: "Extract..." auswählen.

Edit:
Wenn man die Bilder nachträglich dazupackt funktionierts.
Weiß jemand ob Eclipse dazu zu bringen ist gleich alles zusammenzupacken?


----------



## Mad0x (12. Okt 2011)

Wie funktioniert das denn mit z.B. Videos?
Ich hab's mal so versucht:

```
InputStream  Video = (getClass().getResourceAsStream(
	"Video/Intro.avi"));
```
Es exportiert das Video zwar mit, jedoch lässt sich die .jar-Datei nicht öffnen. An was liegt das?
Danach möchte ich das Video eben mit einem ProcessBuilder abspielen, das funktioniert dann so:

```
static ProcessBuilder VideoPlayer = new ProcessBuilder("cmd.exe", "/c","Video/Naruto AMVFINAL_mjpeg_001.avi" );
VideoPlayer.start();
```

Kann hier jemand helfen? :S


----------



## Mad0x (12. Okt 2011)

Mad0x hat gesagt.:


> Wie funktioniert das denn mit z.B. Videos?
> Ich hab's mal so versucht:
> 
> ```
> ...



Kann leider nicht mehr editieren.. Aber im 2. Programmschnipsel heisst es natürlich auch Intro.avi


----------

