# Bilder in Jar anzeigen lassen



## Guest21 (23. Jan 2012)

Guten Morgen allerseits,

Ich habe hier ein Problem, wofür ich (auch hier) schon etliche von Beiträgen gelesen habe, aber keine Lösung gefunden habe.

Folgender Ablauf:
Starte mein Programm auf dem PC, der Ablauf funktioniert normal und die Bilder werden mit angezeigt.

Nun soll es aber nicht auf MEINEM Pc laufen sondern auch auf jedem x-beliebigen, also eine .jar File von dem Projekt erstellt.

Ablauf:
Es passiert nix. Wenn ich das Programm in der Konsole starte kommt eine NullPointerException, warum weiß ich nur wie ich das beheben kann nicht. 

QUELL TEXT

```
URL bildurl = getClass().getResource("ordner/bild");
ImageIcon bild = new ImageIcon(bildurl);
screen = new JLabel(bild);
```

Das ist der Quelltext den ich bisher habe, um die Bilder anzeigen zu lassen was leider nur im Eclipse funktioniert. Sobald ich die .jar file erstelle nicht mehr. Die Bilder sind im selben Verzeichnis wie die .class Dateien nur noch im Unterordner

pls help, wie kann ich jetzt die Datei noch im .jar anzeigen lassen?


----------



## Kakulukiam21 (23. Jan 2012)

Habe es auch mit 


```
System.getProperty("user.dir");
```

versucht aber das hatte genau so wenig Erfolg


----------



## Michael... (23. Jan 2012)

Hast Du überprüft, ob die Bilder auch tatsächlich im jar mit enthalten und im richtigen Package zu finden sind? (Falls nicht bekannt können jars mit eine zip Tool geöffnet werden)

```
getClass().getResource("ordner/bild");
```
 so wird relativ zur aufrufenden Klasse gesucht. heisst parallel zu Klasse sollte noch ein Sub Package "ordner" exisitiern in dem sich "bild" befindet.
Wenn "ordner" ein "Root" ist, dann könnte man auch eine absolute Angabe machen 
	
	
	
	





```
...getResource("[B][SIZE="5"]/[/SIZE][/B]ord...
```


----------



## Kakulukiam21 (23. Jan 2012)

> Hast Du überprüft, ob die Bilder auch tatsächlich im jar mit enthalten und im richtigen Package zu finden sind?



Ich habe mit WinRAR überprüft und sie sind vorhanden, daran liegt es nicht 



> heisst parallel zu Klasse sollte noch ein Sub Package "ordner" exisitiern in dem sich "bild" befindet.
> Wenn "ordner" ein "Root" ist, dann könnte man auch eine absolute Angabe machen ...getResource("/ord...



Sry, das versteh ich grad auf anhieb nicht.
Also meine Erklärung dafür wäre, ich erstelle ein weiteres package welches nur die Bilder enthält?


----------



## bygones (23. Jan 2012)

liegen die Bilder direkt im Ordner mit der Klasse die das Bild laedt ? => [c]getClass().getResource("bild");[/c]
liegt der Ordner mit den Bildern in einem Unterordner der Klasse die das Bild laedt ? => [c]getClass().getResource("unterordner/bild");[/c]
liegt der Ordner mit den Bildern in einem ordner im Rootverzeichnis ueber der Klasse die das Bild laedt ? => [c]getClass().getResource("/ordner/bild");[/c]

allgemein wuerde ich immer die dritte variante empfehlen.


----------



## Kakulukiam21 (23. Jan 2012)

> liegen die Bilder direkt im Ordner mit der Klasse die das Bild laedt ? => getClass().getResource("bild");
> liegt der Ordner mit den Bildern in einem Unterordner der Klasse die das Bild laedt ? => getClass().getResource("unterordner/bild");
> liegt der Ordner mit den Bildern in einem ordner im Rootverzeichnis ueber der Klasse die das Bild laedt ? => getClass().getResource("/ordner/bild");



Hier ist der 2te Fall zutreffend.... 
der Ordner _bilder_ liegt zusammen mit der Klasse die das Bild laden soll in einem Ordner,

Srry, was meinst du jetzt mit Rootverzeichnis?

Solle ich den Ordner nicht im selber Ordner wie die Klassen setzen sondern in einem Verzeichnis darüber?


EDIT:


```
URL bildurl = getClass().getResource("/bilder/bild.png");
```

Tipp befolgt, im Eclipse alles super - Jar einfach no go


----------



## Michael... (23. Jan 2012)

Wie sieht denn die Struktur im jar aus? Vielleicht kannst Du das ja hier mal posten.

Wenn man so etwas hat:

```
mein.package
           |- MyClass.class
           |- ordner
                  |- bild.png
```
Dann müsste ein Aufruf in mein.package.MyClass mit 
	
	
	
	





```
this.getClass().getResource("ordner/bild.png")
```
 funktionieren.
Was aber grundsätzlich und von überall auch funktioniert wäre 
	
	
	
	





```
this.getClass().getResource("/mein/package/ordner/bild.png")
```


----------



## Kakulukiam21 (23. Jan 2012)

```
package.jar
              |- bilder
                        |-bild 1
                        |-bild 2
              
              |- META-INF
              |-projekt
                         |- Klasse1.class 
              |.classpath
```

Namen stimmen jetzt nicht ganz aber so sieht es aus 


EDIT: 
Habe es mit

```
URL bildurl = this.getClass().getResource("/bilder/bild");
```
probiert... 
Ergebnis = Keine Bilder wenn ich es als Jar ausführe...


----------



## bygones (23. Jan 2012)

dann [c]/bilder/bild1.png"[/c]


----------



## Kakulukiam21 (23. Jan 2012)

bygones, das .png ist natürlich immer dabei  

Mein Problem liegt eher das wenn das ganze im Eclipse läuft (Laufwerk D geht alles... wenn ich es als Jar exportiere (Laufwerk G kommen keine Bilder zum Vorscheinen


----------



## Michael... (23. Jan 2012)

Kannst Du das jar (inkl. Quellcode) eventuell mal hier hochladen?


----------



## Kakulukiam21 (23. Jan 2012)

Musste die Bilder leider rauswerfen, weil es sonst zu groß gewesen wäre =/


----------



## Michael... (23. Jan 2012)

Kakulukiam21 hat gesagt.:


> Musste die Bilder leider rauswerfen, weil es sonst zu groß gewesen wäre =/


Aber gerade das wäre interessant gewesen. Es hätten ja auch ein paar Dummy Bilder gereicht.

Ich habe in das jar zwei Dummy Bilder gesteckt 
	
	
	
	





```
bilder/Buttons/Einzeltier_50x50.png
```
 und 
	
	
	
	





```
bilder/01_UTa_UI_Automat.png
```
 und bekomme beim keine NullPointerException wegen fehlender Bilder. Ausführen kann ich das Programm dennoch nicht, da es vermutlich mit JDK1.7 kompliliert wurde.


----------



## Kakulukiam21 (23. Jan 2012)

Hallo Moin, ich habe eine überraschende Wendung bekommen.

Ich habe für die jeweiligen Button auch ein Icon gesetzt mit 

```
ImageIcon kalb = new ImageIcon(getClass().getResource("/bilder/Buttons/passendesBild.png"));
```

Diese werden wunderbar angezeigt auf dem PC, auf anderen PC, überall wo man es startet.

Das Hintergrundbild weigert sich jedoch partu sich anzeigen zu lassen und haut mir eine NullPointerException an der Stelle raus.


Auch wenn ich das Hintergrundbild wie das Icon anzeigen lassen funktioniert es nicht, was läuft da anders? 



> Ausführen kann ich das Programm dennoch nicht, da es vermutlich mit JDK1.7 kompliliert wurde.



Hm, ich habe es eigentlich als JavaSE-1.6(jre7) am laufen


----------



## Michael... (23. Jan 2012)

Kakulukiam21 hat gesagt.:


> Auch wenn ich das Hintergrundbild wie das Icon anzeigen lassen funktioniert es nicht, was läuft da anders?


Da muss ich passen.


Kakulukiam21 hat gesagt.:


> Hm, ich habe es eigentlich als JavaSE-1.6(jre7) am laufen


Sorry, stimmt im Header der class Files steht die 1.6. Hatte beim einen Test scheinbar die Umgebungsvariablen nicht richtig auf meine 1.6 umgebogen...


----------



## turtle (23. Jan 2012)

Welches Hintergrundbild?


----------



## Kakulukiam21 (23. Jan 2012)

Hey Turtle, eigentlich steht hier schon alles erklärt aber noch mal folgendes:

Mein Programm startet in Eclispe wunderbar und alles wird angezeigt jedoch nicht in der .jar 


```
public class GuiTest {
	private JButton kaelber;
	private JButton warning;
	private JButton automaten;
	private JButton uta;
	private JLabel screen;
	private JTextArea begruessung;
	Tools hilfe = new Tools();
	ImageIcon kalb = new ImageIcon(getClass().getResource("/bilder/Buttons/tier.png")); //wird angezeigt
	ImageIcon automat = new ImageIcon(getClass().getResource("/bilder/Buttons/automat.png")); //wird angezeigt
	ImageIcon utaButton = new ImageIcon(getClass().getResource("/bilder/Buttons/anderes.png")); //wird angezeigt
	ImageIcon warnung = new ImageIcon(getClass().getResource("/bilder/Buttons/Hinweis.png")); //wird angezeigt
	ImageIcon bild = new ImageIcon(getClass().getResource("/bilder/hintergrundbild.png")); //wird nicht angezeigt

	public void guiErstellung() {
		/*System.out.println(getClass());
		System.out.println(getClass().getResource("/bilder/hintergrundbild.png"));
		System.out.println(System.getProperty("user.dir"));*/
		
		final JFrame gui = new JFrame();
		gui.setTitle("UTa");
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		gui.setUndecorated(true);
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		gui.setSize(screenSize);
//		gui.setSize(1024,768);

		gui.setLayout(null);
		System.out.println();
		screen = new JLabel(bild);
		screen.setBounds(0, 0, 1024, 768);
		gui.getContentPane().add(screen);
```

Und da ist jetzt mein Problem, da das letzte Bild nicht angezeigt wird


----------



## turtle (23. Jan 2012)

Sorry, den Source hatte ich nicht gesehen 

Bei mir läufts ordentlich und bild wird angezeigt.

Mir fallen noch einige Dinge auf:


Null-Layout solltest Du nicht verwenden. Layout-Manager sind Deine Freunde.
setUndecorated ist bei maximized Fenstern doof, weil kein Close-Button klickbar.
Auf einem Frame rufe ich immer vor der Anzeige pack() auf.
Es fehlt das Anzeigen des GUI mit setVisible(true).

Hier mal meine Version, die alle Bilder anzeigt:

```
public void guiErstellung() {
        /*System.out.println(getClass());
        System.out.println(getClass().getResource("/bilder/hintergrundbild.png"));
        System.out.println(System.getProperty("user.dir"));*/
        
        final JFrame gui = new JFrame();
        gui.setTitle("UTa");
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        System.out.println();
        JLabel lblKalb = new JLabel(kalb);
        JLabel lblautomat = new JLabel(automat);
        JLabel lblutaButton = new JLabel(utaButton);
        JLabel lblwarnung = new JLabel(warnung);
        JLabel lblBild = new JLabel(bild);
        JPanel panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.add(lblKalb);
        panel.add(lblautomat);
        panel.add(lblutaButton);
        panel.add(lblwarnung);
        panel.add(lblBild);
        gui.add(panel);
        gui.pack();
        gui.setVisible(true);
    }
```


----------



## Kakulukiam21 (23. Jan 2012)

Hat alles sein Grund



> Null-Layout solltest Du nicht verwenden. Layout-Manager sind Deine Freunde.


Stimmt schon, nur muss ich Buttons genau auf den Pixel positionieren und wenn ich ein LayoutManager benutze funzelt das nicht so ganz



> setUndecorated ist bei maximized Fenstern doof, weil kein Close-Button klickbar.


Stimmt auch wieder, jedoch habe ich Programm-Intern ein Button der dann das Programm beendet und wo ich wieder raus kommen 



> Auf einem Frame rufe ich immer vor der Anzeige pack() auf.


Okay, das habe ich bisher nicht gemacht, was macht es denn eigentlich? 



> Es fehlt das Anzeigen des GUI mit setVisible(true).



Wie gesagt, 100 zeilen Code wären zu viel besonders da ja 70 wunderbar gehen und ich dachte ich zeige den Part der NICHT geht 


Und wieso funktioniert das überall nur bei mir nicht AAAAHHH! 

Ah ich merke was der Fehler sein könnte... jetzt poste ich doch mal alles 


```
package xxx;

//import java.awt.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import javax.swing.*;
import uta.Tools;

public class GuiTest {
	private JButton button1;
	private JButton button2;
	private JButton button3;
	private JButton button4;
	private JLabel screen;
	private JTextArea begruessung;
	Tools hilfe = new Tools();
	ImageIcon tier = new ImageIcon(getClass().getResource(
			"/bilder/Buttons/bildButton1.png")); // wird angezeigt
	ImageIcon gedöns = new ImageIcon(getClass().getResource(
			"/bilder/Buttons/bildButton3.png")); // wird angezeigt
	ImageIcon gedönsButton = new ImageIcon(getClass().getResource(
			"/bilder/Buttons/button4.png")); // wird angezeigt
	ImageIcon blaa = new ImageIcon(getClass().getResource(
			"/bilder/Buttons/button2.png")); // wird angezeigt
	ImageIcon bild = new ImageIcon(getClass().getResource(
			"/bilder/startbildschirm.png")); // wird nicht angezeigt

	public void guiErstellung() {
		final JFrame gui = new JFrame();
		gui.setTitle("XXX");
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		gui.setUndecorated(true);
		gui.pack();
		
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		gui.setSize(screenSize);
		// gui.setSize(1024,768);

		gui.setLayout(null);
		screen = new JLabel(bild);
		screen.setBounds(0, 0, 1024, 768);
		gui.getContentPane().add(screen);

		begruessung = new JTextArea(
				"Willkommen und so");
		begruessung.setBounds(249, 50, 620, 40);
		begruessung.setFont(new Font("Veranda", Font.PLAIN, 30));
		gui.getContentPane().add(begruessung);

		button1 = new JButton(tied);
		kaelber.setBounds(249, 223, hilfe.button, hilfe.button);
		kaelber.setBackground(Color.white);
		gui.getContentPane().add(kaelber);

		button2 = new JButton(blaa);
		warning.setBounds(571, 264, hilfe.button, hilfe.button);
		warning.setBackground(Color.white);
		gui.getContentPane().add(warning);

		button3 = new JButton(gedöns);
		automaten.setBounds(714, 170, hilfe.button, hilfe.button);
		automaten.setBackground(Color.white);
		gui.getContentPane().add(automaten);

		button4 = new JButton(gedönsButton);
		uta.setBounds(890, 341, hilfe.button, hilfe.button);
		uta.setBackground(Color.white);
		gui.getContentPane().add(uta);

		gui.setVisible(true);

		button1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				gui.dispose();
			}
		});

		button2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				gui.dispose();
			}
		});

		button3.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				gui.dispose();
			}
		});

		buton4.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				gui.dispose();
			}
		});
	}

}
```


Könnte es sein das er es nicht macht weil ich es ohne JPanel mache?


----------



## turtle (23. Jan 2012)

Es wird das Fenster resized so dass alle Komponenten _"gut"_ reinpassen. 
Die Javadoc dazu
[EDIT]public void pack()
Causes this Window to be sized to fit the preferred size and layouts of its subcomponents. The resulting width and height of the window are automatically enlarged if either of dimensions is less than the minimum size as specified by the previous call to the setMinimumSize method.
If the window and/or its owner are not displayable yet, both of them are made displayable before calculating the preferred size. The Window is validated after its size is being calculated.[/EDIT]



> Und wieso funktioniert das überall nur bei mir nicht AAAAHHH!


Ich würde ja anders herum vorgehen und alle Bilder testweise anzeigen (siehe mein Update meiner Antwort). Danach sagst Du möchtest Du die Decoration weghaben, also nimmst Du den Aufruf setDecorated rein. Das Programm soll maximiert angezeigt werden, also...

Aber so weisst Du ob alle Bilder initial angezeigt werden können. Bei mir können und werden


----------



## Kakulukiam21 (23. Jan 2012)

So, ich bin mal mit dem Debugger ran gegangen 

[JAVA=31]ImageIcon bild = new ImageIcon(getClass().getResource(
			"/bilder/startbildschirm.png")); [/code]
bild-> description = file:/PFAD/bilder/startbildschirm.png


[JAVA=53]JLabel design = new JLabel(bild);[/code]
bild-> description = file:/PFAD/bilder/startbildschirm.png


[JAVA=86]screen.add(design);[/code]
bild-> description = file:/PFAD/bilder/startbildschirm.png



```
Exception in thread "main" java.lang.NullPointerException
	at uta.GuiTest.guiErstellung(GuiTest.java:86)
	at uta.Main.main(Main.java:12)
```

Hilfe?


----------



## bygones (23. Jan 2012)

pack ist bei null layout irrelevant. Es ermittelt im Grunde den Platzverbrauch deiner Komponenten und zeigt dann die minimalste Groesse an.

@Topic
ist schwer zu sagen, wenn wir nicht wissen, was Zeile 86 genau ist. Sicher dass es das bild ist und nicht ein anderes Objekt, was null ist ?


----------



## Kakulukiam21 (23. Jan 2012)

So meine lieben Freunde, 

Danke erst mal das ihr mir mir soweit geholfen habt auch wenn ich dann kläglich am System gescheitert bin 

Also eine knappe Zusammenfassung wie ich das jetzt hier gemacht habe.

Die Bilder sollten in einem eigenen Order liegen, welches in dem Überverzeichnis von den .class Dateien ist


```
Projekt
       |-bin
             |-bilderordner
             |-package
```

Ich habe es jetzt mit ImageIcon gemacht, ob es mit anderen Sachen geht weiß ich nicht.

Das Bild wird dann mit

```
ImagIcon bild = new ImageIcongetClass().getResource(
			"/bilder/bild.png"));
```

geladen. 


*WICHTIG:* Achtet genau auf den Dateinamen und die Dateienbezeichnung und Groß und Kleinschreibung (ob jetzt .png oder .PNG)

Danach ganz einfach das Bild dem JLabel oder sonstigem hinzufügen. Dann sollte es ohne Probleme angezeigt werden


```
JLabel label1 = new JLabel(bild)
```

Das sollte dann alles funktionieren 


MfG Kakulukiam21

PS: Bei mir lag es wirklich daran das es .PNG war und ich immer .png geschrieben habe  *rage*


----------



## Kakulukiam21 (24. Jan 2012)

Was ich gestern noch vergessen hatte:

Noch ein Hinsweis, bitte achtet auch darauf ob der Dateiname Leerzeichen enthält wie zB:


```
Ferienurlaub 2012.jpeg
```

Nimmt das Leerzeichen raus oder erstetzt es:


```
Beispiel 1: Ferienurlaub2012.png
Beispiel 2: Ferienurlaub_2012.png
```

Hinzukommt das (zumindest bei mir) Java die JPEG nicht erkannt hat von daher ruhig auf png umstellen, tut ja keinem weh 

MfG Kakulukiam

Ein Mist das ich hier nach längerer Zeit keine Edit-Funktion habe :noe:

Aber mir fällt das leider nur nach und nach ein.

Wenn ihr die Sachen kompilieren wollt und habt dir voherigen Punkte *ALLE* beachtet. Vergwissert euch ob die Datein überhaupt in der .jar sind (.jar > WinRAR) Sollte nicht schwer sein.

Wenn sie es NICHT sind obwohl ihr sie im Projektordner habt und Eclipse oder sonstige exportiert sie nicht mit, solltet ihr mit Rechtsklick auf das Projekt klicken und *Refresh* auswählen oder einfach F5 drücken.

Nun sollten alle Datein mit exportiert werden =)


----------

