ImageIcon wird nicht angezeigt

Taso44

Aktives Mitglied
Hallo zusammen,
ich bin gerade dabei den Umgang mit dem KeyListener zu üben und bin auf ein
Problem gestoßen, wo ich nicht erkenne wo der Fehler liegt.
Ich habe bereits ein Fenster (JFrame) und wollte ein Icon in Verbindung mit JLabel ins Fenster laden.
Es funktioniert soweit alles bis auf das Laden des Bildes.
Vielleicht erkennt jmd einen Fehler Danke.

Mein Code:
Java:
package keyListenerVersuch;

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class MyFrame  extends JFrame implements KeyListener{

    JLabel label; 
    ImageIcon icon;
 
    MyFrame(){
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setSize(600,600);
        this.setLayout(null);
        this.addKeyListener(this);
        label = new JLabel();

        icon = new ImageIcon("kanone.png");
        label.setIcon(icon); 
        
        this.getContentPane().setBackground(Color.black);
        
        label.setBounds(0, 0, 120, 120);
//        label.setBackground(Color.blue);
//        label.setOpaque(true);
        

        this.add(label);
        this.setVisible(true);
    }
    

    @Override
    public void keyPressed(KeyEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void keyTyped(KeyEvent e) {
        
        switch(e.getKeyChar()) {
        case 'l' : label.setLocation(label.getX()-10, label.getY()); //left
        break;
        case 'u': label.setLocation(label.getX(), label.getY()-10); //up
        break;
        case 'd': label.setLocation(label.getX(), label.getY()+10); //down
        break;
        case 'r': label.setLocation(label.getX()+10, label.getY()); //right
        break;
        
        }
        
    }
    
    //Main
    public static void main(String[] args) {
        MyFrame f = new MyFrame();
        
    }
}
 
Wahrscheinlich kann das Bild nicht gelesen werden, weil es sich im falschen Pfad befindet.
Ich habe das Bild in das selbe Package gepackt wie die Klasse, dürfte das nicht reichen?
(ich hatte auch ein anderes Bild aus Paint was ich erstellt habe, da das nicht funktionierte hab ich die "kanone" oben aus dem Internet genommen, aber vermutlich liegt das eh nicht an so etwas"
 
Du solltest das Bild dann nicht als Datei sondern als Ressource laden. Das ginge also mit einem Code wie:
icon = new ImageIcon(getClass().getResource("kanone.png"));

Ressourcen werden über den Classloader geladen - somit kann es auch aus einem jar File geladen werden und so.

Das Problem jetzt ist, dass es als Datei im aktuellen Verzeichnis gesucht wird. Und da ist es nicht, da die Datei ja bei Deiner Klasse liegt.
 
Du solltest das Bild dann nicht als Datei sondern als Ressource laden. Das ginge also mit einem Code wie:
icon = new ImageIcon(getClass().getResource("kanone.png"));

Ressourcen werden über den Classloader geladen - somit kann es auch aus einem jar File geladen werden und so.

Das Problem jetzt ist, dass es als Datei im aktuellen Verzeichnis gesucht wird. Und da ist es nicht, da die Datei ja bei Deiner Klasse liegt.
Falls ich das richtig verstanden habe, dann doch also ich habe das Bild kopiert und in das Package eingefügt. Also es ist noch da.
Ich seh jetzt auch schon was, aber nur ein weißer Kasten. Soll wohl das Bild sein🙂
 
Ich habe das Bild in das selbe Package gepackt wie die Klasse, dürfte das nicht reichen?
Nein
Falls ich das richtig verstanden habe, dann doch also ich habe das Bild kopiert und in das Package eingefügt. Also es ist noch da.
Ich seh jetzt auch schon was, aber nur ein weißer Kasten. Soll wohl das Bild sein
Stichwort: "in das package". Den Packagepfad musst du mit angeben.
Wenn du nichts angibst, dann wird im root gesucht, also ohne Unterverzeichnis für das Package.

Bilder einfach ins Quellcodeverzeichnis kopieren ist keine gute Idee.
In so ziemlich jeder IDE sind Quellcode und Resourcen getrennt. Das Verzeichnis mit den Resourcen wird dann der Jar hinzugefügt.
 
Stichwort: "in das package". Den Packagepfad musst du mit angeben.
Wenn du nichts angibst, dann wird im root gesucht, also ohne Unterverzeichnis für das Package.
Nein, getResource auf der Klasse aufgerufen sucht im Package der Klasse. Nur wenn man getResource direkt vom Classloader aufruft, dann sucht er von dem "root" des Classpath.

Before delegation, an absolute resource name is constructed from the given resource name using this algorithm:

  • If the name begins with a '/' ('\u002f'), then the absolute name of the resource is the portion of the name following the '/'.
  • Otherwise, the absolute name is of the following form:
    modified_package_name/name
    Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e')
 

Zurück
Oben