Bilder in Jar anzeigen lassen

  • Themenstarter Themenstarter Guest21
  • Beginndatum Beginndatum
G

Guest21

Gast
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
Java:
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?
 
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)
Code:
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
Code:
...getResource("[B][SIZE="5"]/[/SIZE][/B]ord...
 
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?
 
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.
 
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:

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

Tipp befolgt, im Eclipse alles super - Jar einfach no go
 
Zuletzt bearbeitet:
Wie sieht denn die Struktur im jar aus? Vielleicht kannst Du das ja hier mal posten.

Wenn man so etwas hat:
Code:
mein.package
           |- MyClass.class
           |- ordner
                  |- bild.png
Dann müsste ein Aufruf in mein.package.MyClass mit
Code:
this.getClass().getResource("ordner/bild.png")
funktionieren.
Was aber grundsätzlich und von überall auch funktioniert wäre
Code:
this.getClass().getResource("/mein/package/ordner/bild.png")
 
Code:
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
Java:
URL bildurl = this.getClass().getResource("/bilder/bild");
probiert...
Ergebnis = Keine Bilder wenn ich es als Jar ausführe...
 
Zuletzt bearbeitet:
😀 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
 
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
Code:
bilder/Buttons/Einzeltier_50x50.png
und
Code:
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.
 
Hallo Moin, ich habe eine überraschende Wendung bekommen.

Ich habe für die jeweiligen Button auch ein Icon gesetzt mit
Java:
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
 
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

Java:
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
 
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:
Java:
    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);
    }
 
Zuletzt bearbeitet:
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 😉

Java:
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?
 
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😉
 
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


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

Hilfe?
 
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 ?
 
Zuletzt bearbeitet von einem Moderator:
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

Code:
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
Java:
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

Java:
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*
 
Was ich gestern noch vergessen hatte:

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

Code:
Ferienurlaub 2012.jpeg

Nimmt das Leerzeichen raus oder erstetzt es:

Code:
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 =)
 

Zurück
Oben