.jar findet ImageIcon nicht

Q-Dog

Mitglied
Guten Morgen,

ich habe folgendes Problem und zwar findet meine .jar Datei die ImageIcons nicht.
In Eclipse funktioniert allerdings alles einwandfrei.

Ich binde die ImageIcons wie folgt ein:
Java:
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("../../gfx/gui/hauptmenu/spielmenu_hintergrund.png"));

Ich hab jetzt schon ne Weile nach Lösungen gesucht aber nichts gefunden.
Ich vermute, dass .jar mit dem "../" nicht klarkommt, wüsste aber nicht wie ich dies umgehen könnte.

Ich hoffe ihr könnt mir helfen.


Liebe Grüße,
Q-Dog
 
Das sollte kein Problem sein. Zeig mal bitte die Verzeichnisstruktur in deiner Jar-Datei.
Interessant wäre auch die Fehlermeldung, die der Interpreter ausgibt, wenn du die Jar-Datei mal mit
Code:
java -jar DeinJar.jar
startest.
 
Hallo L-ectron-X, vielen Dank schonmal für deine Antwort.

Die Fehlermeldung ist:
Java:
java -jar Texas.jar
Exception in thread "main" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(ImageIcon.java:167)
	at spiel.menue.Hauptmenue.<init>(Hauptmenue.java:32)
	at Texas_Codeem.main(Texas_Codeem.java:20)

Wie gesagt er findet die Bilder nicht.


Die Verzeichnisstruktur ist die Folgende
Java:
src 
 |- main (Klasse mit Main-Methode)
 |- spiel
     |- ablauf
     |- auswertung
     |- menu (hier ist das Hauptmenue von oben)
 |- gfx
     |- gui
         |- hauptmenu (Bilder)
         |- karten (Bilder)
         |- tisch (Bilder)

Sprich aus dem menu muss man 2 Ordner hoch, dann in gfx/gui/hauptmenu/*.png

In Eclipse selbst funktionierts ja auch.

Gruß Q-Dog
 
Moin,

versuch mal:

Java:
final ImageIcon hintergrundIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("gfx/gui/hauptmenu/spielmenu_hintergrund.png")));

Gruß,
Fancy
 
na in eclipse isses rot unterkringelt (obwohl ich ImageIO importiert habe) und wenn ich auf den Hinweis klicke "Nothing to suggest"
 
Hm, das ImageIO.read() kann ne IOException werfen. Dazu sollte Eclipse Dir aber Lösungen zeigen können. Wenn es daran liegt, entweder per throws IOException weiterreichen, oder:

Java:
        ImageIcon hintergrundIcon;
        
        try {
            
            hintergrundIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("gfx/gui/hauptmenu/spielmenu_hintergrund.png")));
            
        } catch (IOException e) {
            
            e.printStackTrace();
            
        }

Ansonsten zeig doch mal die komplette Methode, in der das geladen wird.

Gruß,
Fancy
 
Ah stimmt lag an der Exception, danke 🙂

Allerdings löst es das Problem nicht, das Bild wird nun gar nicht angezeigt, weder in Eclipse noch in der .jar.
 
Wenn es nicht angezeigt wird, sollte vorher die Exception fliegen. Und die gibt den Stacktrace aus. Was wird den da ausgegeben?

Und bist Du sicher, dass die Pfade stimmen? (Beim Weg über den ClassLoader kommen keine ../../ davor)

Gruß,
Fancy
 
Ne also ne Exception fliegt komischerweise nicht.

Das Bild wird gefunden, nur irgendwie nicht angezeigt (hab sonst nichts verändert).
Und bei der Pfadangabe hab ich das "../../" weggelassen.
 
Wenn ich nichts übersehen habe, sollte es so funktionieren:
Java:
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("../gfx/gui/hauptmenu/spielmenu_hintergrund.png"));
oder so:
Java:
ImageIcon hintergrundIcon = new ImageIcon(Hauptmenue.class.getResource("../gfx/gui/hauptmenu/spielmenu_hintergrund.png"));
 
eine Klasse hat "Package + Name" als vollständigen Namen. So ist z.B. "org.xyz.MyClass" der Namen der Klasse und nicht "MyClass". Wenn man also relative Grafiken laden will, müssen diese relativ zum Klassenamen liegen, was in diesem Fall das wäre:

Java:
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("/gfx/gui/hauptmenu/spielmenu_hintergrund.png"));

Alternativ würde auch das gehen:

Java:
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("gfx/gui/hauptmenu/spielmenu_hintergrund.png"));

Slawa
 
eine Klasse hat "Package + Name" als vollständigen Namen. So ist z.B. "org.xyz.MyClass" der Namen der Klasse und nicht "MyClass". Wenn man also relative Grafiken laden will, müssen diese relativ zum Klassenamen liegen, was in diesem Fall das wäre:

Java:
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("/gfx/gui/hauptmenu/spielmenu_hintergrund.png"));

Alternativ würde auch das gehen:

Java:
ImageIcon hintergrundIcon = new ImageIcon(getClass().getResource("gfx/gui/hauptmenu/spielmenu_hintergrund.png"));

Slawa

Ja genau so hab ich nun auch alles umgebaut.
Sprich den gfx Ordner aufgesplittet und in Unterverzeichnisse der Packages gepackt.

@Guest2
Mom ich schau mal ^^

//edit
Ja tatsächlich, das funktioniert!
Das ist ja mehr als komisch.

Naja hab das Projekt nun wie oben beschrieben einfach umgebaut.

Nochmals vielen Dank euch allen für eure Mühe.
 
Zuletzt bearbeitet:
Da ich für das gleiche Problem keinen neuen Thread öffnen will, schreib ich das einfach mal hiermit hinzu.

ich hab jetzt schon den ganzen Tag gesucht und bisher keine funktionierende Lösung gefunden. Auch hab ich
Java:
        try {

            ImageIcon openIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("../images/tree_open.jpg")));
            ImageIcon closedIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("../images/tree_close.jpg")));
            ImageIcon leafIcon = new ImageIcon(ImageIO.read(getClass().getClassLoader().getResourceAsStream("../images/file_music.png")));
            renderer.setOpenIcon(openIcon);
            renderer.setClosedIcon(closedIcon);
            renderer.setLeafIcon(leafIcon);
            tree.setCellRenderer(renderer);

        } catch (IOException e) {

            e.printStackTrace();

        }
probiert. Aber funktioniert hat auch dies nicht.

Meine Struktur sieht wie folgt aus:

Java:
gui
|- gui
    |- images
    |- sammlungtable
Der angegeben Code kommt aus einer Klasse, die sich im sammlungtable-Package befindet.
Bilder werden bisher nur dann angezeigt, wenn die Klasse direkt im gui-Package ist.

Was mache ich falsch und wie kann ich das Problem lösen? Danke schonmal

edit: habs jetzt gelöst. hab nun auch noch die packages angegeben, die überhalb von gui sind.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben