ImageIcons in (J)Applet und .jar-File verschwinden

sirstefan

Mitglied
Hallo,
ich habe ein Problem.
Und zwar habe ich mit Java unter Nutzung der swing-Komponenten ein kleines Schere-Stein-Papier-Spielchen gemacht.
Der Benutzer hat die Wahl zwischen 3 Buttons, die jeweils mit einem Bildchen (ImageIcon) einer Schere, eines Steins und eines Papiers versehen sind (.png). Der PC generiert eine Zahl von 0 - 2 und je nachdem wählt er auch zwischen Schere, Stein und Papier.
Die Auswahl des Spielers und des Computers wird in einem seperaten JPanel angezeigt. Auch hierfür werden ImageIcons verwendet.
Unter BlueJ und Eclipse funktioniert es prächtigst. Die Bilder sind da, und auch da wo sie sein sollten. Aber nach dem Export in ein .jar-File werden diese beim Ausführen einfach nicht mehr angezeigt.
Jetzt hab ich das ganze in ein Applet umgeschrieben und es passiert dasselbe. Im Applet Viewer bei BlueJ und Eclipse funktioniert es zwar, wenn ich es im Browser teste werden auch hier wieder die ImageIcons nicht angezeigt (das .jar-File für das Applet ist signiert).
Ich habe gegoogelt und verschiedene Sachen durchprobiert.
FilePermission, ClassLoader.getSystemResource(), MediaTracker,...
Eclipse hat auch ein java.policy.applet erstellt, was laut Google-Ergebnissen auch was bringen sollte, was es aber nicht tut (es befindet sich ebenfalls im .jar-File).
Die Pfade zu den Dateien sind alle richtig, es befindet sich alles im selben Ordner.
Ich hoffe, dass ihr mir weiterhelfen könnt.
Hier der Code des Applets:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SSPApplet extends JApplet{
    //private static JFrame frame = new JFrame();
    private static JButton schereB, steinB, papierB;
    //private static JMenuItem start;
    private static JPanel panelMitte = new JPanel();
    private static JLabel textLabel = new JLabel();
    private static JLabel textPLLabel = new JLabel();
    private static JLabel textPCLabel = new JLabel("  Computer");
    private static JLabel bildPCLabel = new JLabel("PC-Bild");
    private static JLabel bildPLLabel = new JLabel("PL-Bild");
    private static int zahl1, zahl2;
    private static ImageIcon bildPC, bildPL;    
    private static ImageIcon schere = new ImageIcon("schere.png");
    private static ImageIcon stein = new ImageIcon("stein.png");
    private static ImageIcon papier = new ImageIcon("papier.png");
    public void init(){ //Alles, was mit Menüleiste und Frame zu tun hat, wurde wegkommentiert.
        //Dings definieren und so ANFANG
        JPanel panelText = new JPanel();
        JPanel panelButton = new JPanel();       
        Container inhalt;
        FlowLayout panelBL = new FlowLayout(FlowLayout.CENTER); 
        //ENDE
        //Menü ANFANG
        //JMenuBar menu = new JMenuBar();
         //datei
        //JMenu datei = new JMenu("Datei");
        //start = new JMenuItem("Neues Spiel");
        //JMenuItem beenden = new JMenuItem("Beenden");
        //mStart(start);
        //mBeenden(beenden);
        //datei.add(start);
        //datei.add(beenden);
         // /datei
        //menu.add(datei);
        //Menü ENDE
        textLabel.setText("<html><body><font size=\"2\">&nbsp;"
                        + "<h2 style=\"color:red\"><center>Willkommen</center></h2>"
                        + "beim lustigen Spiel Schere-Stein-Papier!"
                        + "<br>Klicken Sie auf ein Bild.</body></html>");
        schereB = new JButton("", schere);
        steinB = new JButton("", stein);
        papierB = new JButton("", papier);
        //schereB.setEnabled(false);
        //steinB.setEnabled(false);
        //papierB.setEnabled(false);     
        buttonM(schereB, 1);
        buttonM(steinB, 2);
        buttonM(papierB, 3);
        panelText.add(textLabel);
        panelButton.setLayout(panelBL);        
        panelButton.add("South", schereB);        
        panelButton.add("South", steinB);
        panelButton.add("South", papierB); 
        inhalt = getContentPane();
        inhalt.setLayout(new BoxLayout(inhalt, BoxLayout.Y_AXIS));
        inhalt.add("North", panelText);
        inhalt.add("Center", panelMitte);
        inhalt.add("South", panelButton);
        //frame.setJMenuBar(menu);        
        setVisible(true); //(frame.)
        //frame.setAlwaysOnTop(true);
        //frame.setTitle("SSP - Schere Stein Papier");
        setSize(400,250); //(frame.)
        //frame.setIconImage(new ImageIcon("icon.png").getImage());
        //frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    //private static JFrame namensFrame = new JFrame();
    //private static JTextField namensFeld = new JTextField(20);       
    private static String namePL = " Spieler ";
    public static void buttonM(JButton x, final int z){        
        x.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent y){
                panelMitte.remove(bildPLLabel);
                panelMitte.remove(bildPCLabel);
                switch(z){
                    case 1: zahl1 = z; bildPL = schere; break;
                    case 2: zahl1 = z; bildPL = stein; break;
                    case 3: zahl1 = z; bildPL = papier; break;
                }
                bildPLLabel = new JLabel(bildPL);                
                zahl2 = (int)(Math.random() * 3);
                while(zahl2 == 3){
                    zahl2 = (int)(Math.random() * 3);
                }                    
                switch(zahl2){
                    case 0: bildPC = schere; break;
                    case 1: bildPC = stein; break;
                    case 2: bildPC = papier; break;
                }
                bildPCLabel = new JLabel(bildPC);
                textPLLabel.setText(namePL);
                panelMitte.add(textPLLabel); //Spielername wird zum Panel hinzugefügt
                panelMitte.add(bildPLLabel); //Danach die Auswahl
                panelMitte.add(bildPCLabel); //Danach die Auswahl des Computers
                panelMitte.add(textPCLabel); //Dann der Computername
                checkErfolg();
            }
        });
    }     
    private static int gewonnenPL = 0;
    private static int verlorenPL = 0;
    private static String textPL;
    public static void checkErfolg(){
    	//Hier wird überprüft, ob man gewonnen oder verloren hat
        if(zahl1 == 1 && zahl2 == 2){
            textPL = namePL + " gewinnt! ";
            gewonnenPL++;
        }
        else{
            if(zahl1 == 1 && zahl2 == 1){
                textPL = namePL + " verliert! ";
                verlorenPL++;
            }
            else{
                if(zahl1 == 1 && zahl2 == 0){
                    textPL = " Unentschieden. ";
                }
                else{
                    if(zahl1 == 2 && zahl2 == 2){
                        textPL = namePL + " verliert! ";
                        verlorenPL++;
                    }
                    else{
                        if(zahl1 == 2 && zahl2 == 1){
                            textPL = " Unentschieden. ";
                        }
                        else{
                            if(zahl1 == 2 && zahl2 == 0){
                                textPL = namePL + " gewinnt! ";
                                gewonnenPL++;
                            }
                            else{
                                if(zahl1 == 3 && zahl2 == 2){
                                    textPL = " Unentschieden. ";
                                }
                                else{
                                    if(zahl1 == 3 && zahl2 == 1){
                                        textPL = namePL + " gewinnt! ";
                                        gewonnenPL++;
                                    }
                                    else{
                                        if(zahl1 == 3 && zahl2 == 0){
                                            textPL = namePL + " verliert! ";
                                            verlorenPL++;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        } 
        //Hier wird dann angezeigt, wie oft man gewonnen/verloren hat
        textLabel.setText("<html><body>" + textPL + "<br>" + "Gewonnen: " + gewonnenPL + " Verloren: " + verlorenPL + "</body></html>");
    }
}
Der Code ist halt nicht der schönste, da ich es aus nem JFrame geändert hab.
 
Bitte helft mir, es muss doch irgendeine Möglichkeit geben...
Ich mach zwar nicht gerne Doppelposts aber ich werd langsam schon verrückt wegen dem...
 
Schau mal dort: http://java.sun.com/docs/books/tutorial/uiswing/components/icon.html

Ansonsten: Hast du geschaut ob die Bilder auch tatsächlich im Jar liegen? Wenn ja wo liegen sie relativ gesehen zu der Klasse die du gepostet hast?

In jedem Fall musst du es so in etwa machen wie es in dem Artikel gezeigt ist:
Java:
java.net.URL imgURL = getClass().getResource("bild.png");
new ImageIcon(imgURL);

So wie du es im Moment machst versucht er das Bild im Ausführungsverzeichnis zu finden. Das geht nicht, da es dort nicht liegt. In den IDEs funktioniert das da Ressourcen wie Bilder ins Ausführungsverzeichnis mit kopiert werden.
 
Also, die Bilder befinden sich im selben Ordner wie das .java und das .jar-File selbst.
Im .jar sind die Bilder auch nochmal drinnen.
Ich versteh aber nicht ganz wie du das mit dem Ausführungsverzeichnis meinst... Kannst du mir das mal erklären?
 
Das Ausführungsverzeichnis ist meist das in welchem das jar liegt und gestartet werden kann, eben der Ordner in welchem es ausgeführt wird. Gibst du keinen besonderen Pfad zum Bild an wird versucht dieses im Ausführungsverzeichnis zu finden.

Eclipse z.B. kompiliert die Klassen in einen speziellen Ordner wie z.B. bin oder classes. Von dort wird die Anwendung dann ausgeführt wenn du sie mit eclipse startest. Schau da mal rein, da wirst du auch deine Bilder wiederfinden.

Wenn die Bilder im Jar liegen musst du natürlich den Pfad zu diesen Bildern innerhalb des Jars angeben. Und das funktioniert so wie ich das in dem Beispiel gezeigt habe. Wenn du es nicht hinbekommst poste mal einen kleinen Verzeichnisbaum innerhalb deines Jar.
 
Danke für die Hilfe, mit dem Code funktioniert es. Auch so, wie ich es gemacht habe :)
Du hast mich vor dem psychischen Zerfall gerettet. Danke.


Falls es dich interessiert, das Applet findest du Hier.
Und wieder was dazugelernt.
 
Zurück