# Kein Bild wird angezeigt bei ImageIcon



## PetBe (29. Jul 2017)

Hi Leute,

ich will ein Bild (im PNG-Format) meiner GUI hinzufügen. Ich habe folgenden Code:
"JLabel pictureLabel1 = new JLabel (new ImageIcon ("Bild 1.PNG"));
...
panel.add(pictureLabel1, "right"); "

Ich benutze das MigLayout und das Bild "Bild 1.PNG" ist im selben Verzeichnis wie die class.-Datei. Jedoch wird das Bild nicht angezeigt. Ich habe schon viel rumgespielt aber bekommen es einfach nicht hin. Hat jemand eine Idee?


----------



## Robat (29. Jul 2017)

Wenn es im selben Verzeichnis wie die .class - Dateien liegt liegt musst du natürlich auch den entsprechenden Pfad angeben.
Gibt es einen Grund seine Bilder dort abzulegen und nicht in einem Unterverzeichnis des src-Folders?


----------



## PetBe (30. Jul 2017)

Hi,

ich habe verschiedene Sachen ausprobiert. Leider hat wirklich nichts funktioniert. Z.B.

Bild liegt im selben Verzeichnis wie die class.Datei:
JLabel pictureLabel1 = new JLabel (new ImageIcon ("bin/game/Bild 1.PNG"));

So wie Robat es empfohlen hat: Bild liegt im Unterverzeicznis pictures des src-Folders
JLabel pictureLabel1 = new JLabel (new ImageIcon ("src/pictures/Bild 1.PNG"));

Bild liegt in einem Unterverzeichnis des class-Datei Ordners mit dem Namen "Bilder"
JLabel pictureLabel1 = new JLabel (new ImageIcon ("bin/game/Bilder/Bild 1.PNG"));
ODER
JLabel pictureLabel1 = new JLabel (new ImageIcon ("Bilder/Bild 1.PNG"));

Vollständige Pfadangabe
JLabel pictureLabel1 = new JLabel (new ImageIcon ("C:/Benutzer/T.D/workspace/Games/src/pictures/Bild 1.PNG"));
(Bzw. hier habe ich es auch mit den anderen Foldern ausprobiert)

Leider wurde das Bild nie angezeigt. Vlt. liegt es ja daran, dass ich irgendwo einen Fehler habe bei der Konzipierung der GUI (alles andere funktioniert aber einwandfrei, nur das mit den Bilder leider nicht).


----------



## DaCrazyJavaExpert (30. Jul 2017)

Liegt das Bild, beziehungsweise das Verzeichnis "Bilder" im src Ordner? Ich mache es immer so, dass ich ein extra Ordner(images) für die Bilder habe. Dieser Ordner liegt sozusagen parallel zum src Ordner, was bedeutet, dass ich einfach nur "images/bild.png" schreiben muss. Falls du den Konkreten Pfad angibst,


PetBe hat gesagt.:


> C:/Benutzer/T.D/workspace/Games/src/pictures/Bild 1.PNG


\\ statt /. Keine Ahnung obs n Untersied mach, aber so mache ich es immer.


----------



## Meniskusschaden (30. Jul 2017)

Versuche doch mal, das Icon so zu laden:
	
	
	
	





```
ImageIcon icon = new ImageIcon(getClass().getResource("/icons/icon.png"));
```
Das Verzeichnis "icons" muß dabei in demselben Ordner liegen wie die Klasse, in der sich der Code befindet.
Außerdem würde ich sicherheitshalber prüfen, ob das Icon wirklich nicht geladen wurde. Kann ja theoretisch sein, dass das Laden zwar funktioniert hat, das Bild aber aus einem anderen Grund nicht angezeigt wird.


DaCrazyJavaExpert hat gesagt.:


> \\ statt /. Keine Ahnung obs n Untersied mach, aber so mache ich es immer.


Ich würde beim normalen Schrägstrich "/" bleiben. Das müsste unter allen Plattformen funktionieren.


----------



## PetBe (31. Jul 2017)

Hi Leute, 
irgendwie ist bei mir der Wurm drin :-( . Ich habe das was in den beiden oberen Posts vorgeschlagen wurde   probiert jedoch weiterhin ohne Erfolg (ich kann mich erinnern, dass ich früher schon mit dem ImageIcons zu tun hatte und dort überhaupt keine Probleme hatte). Also ich habe mal 3 Varianten ausprobiert und dazu Screenshots der Ordnerstruktur hochgeladen.

Außerdem ist hier der gesamte Code (mit den zugehörigen 3 Varianten). Ich denke, dass ich irgendwo im Code einen Fehler habe.


```
package game;

import java.awt.BorderLayout;
import java.awt.Container;

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

import net.miginfocom.swing.MigLayout;

public class EinarmigerBandit extends JFrame {
   
    Container c;
   
    JButton startButton = new JButton("Spiel starten!");
    JButton stopButton1 = new JButton("STOP");
    JButton stopButton2 = new JButton("STOP");
    JButton stopButton3 = new JButton("STOP");
   
   
   
      JLabel pictureLabel1 = new JLabel (new ImageIcon ("/pictures/Bild 1.PNG")); //1 Variante) Ordner mit der .java-Datei
      // JLabel pictureLabel1 = new JLabel (new ImageIcon ("/Bilder/Bild 1.PNG"));//2 Variante) Ordner mit der .classDatei
    //   JLabel pictureLabel1 = new JLabel (new ImageIcon ("images/Bild 1.PNG")); //3 Variante) Ordner parallel zum src Ordner
    
   
   
   

   
    public EinarmigerBandit () {
       
        c = getContentPane();

        c.setLayout(new BorderLayout());
       
        //startButton.setEnabled(false);

       
        MigLayout miglayout = new MigLayout();
        JPanel panel = new JPanel(miglayout);
       
        panel.add(startButton,          "width 120px, height 50px, x 225, y 20");

        panel.add(stopButton1,          "width 120px, height 50px, x 60, y 250");
        panel.add(stopButton2,          "widt1h 120px, height 50px, x 240, y 250");
        panel.add(stopButton3,          "width 120px, height 50px, x 420, y 250");
       
        panel.add(pictureLabel1, "width 120px, height 50px, x 320, y 250");
       
       
        c.add(panel);
    }
   
   
   
   
   
   
   
   
   
    public static void main(String[] args) {

        EinarmigerBandit frame = new EinarmigerBandit();
        frame.setTitle("Einarmiger Bandit");
        frame.setSize(615, 450);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        System.out.println(ClassLoader.getSystemResource("Bild 1.PNG"));

    }


}
```

Vielleicht kann mir jemand auf die Sprünge helfen?


----------



## Meniskusschaden (1. Aug 2017)

PetBe hat gesagt.:


> Ich habe das was in den beiden oberen Posts vorgeschlagen wurde probiert


Ich weiß jetzt nicht, welche Posts du meinst. Meinen offenbar nicht, denn damit funktioniert es:

```
JLabel pictureLabel1 = new JLabel(new ImageIcon(getClass().getResource("/pictures/Bild 1.PNG")));
```
im Anhang ist ein Screenshot der Projektstruktur.


----------



## DaCrazyJavaExpert (1. Aug 2017)

Meniskusschaden hat gesagt.:


> Ich weiß jetzt nicht, welche Posts du meinst. Meinen offenbar nicht, denn damit funktioniert es:
> 
> ```
> JLabel pictureLabel1 = new JLabel(new ImageIcon(getClass().getResource("/pictures/Bild 1.PNG")));
> ...


Meine Variante klappt auch bei mir...


----------



## Meniskusschaden (1. Aug 2017)

DaCrazyJavaExpert hat gesagt.:


> Meine Variante klappt auch bei mir...


Ja, aber hast du schon mal getestet, ob das auch in anderen IDEs und außerhalb der IDE als jar funktioniert?


----------



## DaCrazyJavaExpert (1. Aug 2017)

Meniskusschaden hat gesagt.:


> Ja, aber hast du schon mal getestet, ob das auch in anderen IDEs und außerhalb der IDE als jar funktioniert?


Ne, aber Code kann ja schwer von der IDE abhängig sein. Das würde ja bedeuten, dass Nutzer ohne IDE oder anderen IDEs gar nicht das Programm nutzen könnten. Es ist allein vom der Ordneranordnung abhängig.


----------



## Robat (1. Aug 2017)

DaCrazyJavaExpert hat gesagt.:


> ...Es ist allein vom der Ordneranordnung abhängig.


So nicht ganz richtig. Mit absoluten Pfaden (wie C:/images/bild1.png) klappt es nur auf deinem PC  (außer es gibt den Pfad zufälliger Weise auch auf anderen Rechnern )


----------



## PetBe (1. Aug 2017)

Ich habe folgende Instruktion von  "Meniskusschaden" ausprobiert:

```
ImageIcon icon = new ImageIcon(getClass().getResource("/pictures/Bild 1.PNG"));
    JLabel pictureLabel1 = new JLabel (icon);
```

Und der Ordner "pictures" ist im selben Verzeichnis wie die .java-Datei (siehe Anhang). Leider funktioniert es nicht. Das Bild wird einfach nicht angezeigt.


----------



## DaCrazyJavaExpert (1. Aug 2017)

Robat hat gesagt.:


> So nicht ganz richtig. Mit absoluten Pfaden (wie C:/images/bild1.png) klappt es nur auf deinem PC  (außer es gibt den Pfad zufälliger Weise auch auf anderen Rechnern )


Dieses Bild ist doch im programm integriert genauso wie der Ordner, indem das Bild liegt. Der Bildordner liegt parallel zum src ordner. Ich dachte der Pfad würde somit überrall funktionieren, aber ich lasse mich gerne eines anderes belehren.


----------



## DaCrazyJavaExpert (1. Aug 2017)

PetBe hat gesagt.:


> Ich habe folgende Instruktion von  "Meniskusschaden" ausprobiert:
> 
> ```
> ImageIcon icon = new ImageIcon(getClass().getResource("/pictures/Bild 1.PNG"));
> ...


Du hast da dieses Ausrufezeichen, am Projekt. Ich weiß, muss ich sagen, nicht was es bedeutet. Aber bei mir funktioniert in solchen Fällen das Programm nicht. Sa schreibe ich es einfach in einem neuen Projekt neu, oder bessergesagt ich kopiere die Klassen etc. in das neue Projekt.


----------



## Meniskusschaden (1. Aug 2017)

PetBe hat gesagt.:


> Und der Ordner "pictures" ist im selben Verzeichnis wie die .java-Datei (siehe Anhang). Leider funktioniert es nicht. Das Bild wird einfach nicht angezeigt.


Ich habe es mit derselben Struktur wie in deinem letzten Screenshot getestet. Mit deinem ursprünglichen Code (inklusive deiner letzten Anpassung gemäß meinem Vorschlag) hat es funktioniert. Vielleicht hat es auch etwas mit dem Bild zu tun, dass du anzeigen willst. Ich habe nur ein 32x32 Pixel großes Icon benutzt (grüner Pfeil). Im Anhang ist das Ergebnis zu sehen.


----------



## PetBe (5. Aug 2017)

DaCrazyJavaExpert hat gesagt.:


> Du hast da dieses Ausrufezeichen, am Projekt. Ich weiß, muss ich sagen, nicht was es bedeutet. Aber bei mir funktioniert in solchen Fällen das Programm nicht. Sa schreibe ich es einfach in einem neuen Projekt neu, oder bessergesagt ich kopiere die Klassen etc. in das neue Projekt.


Ja, das war das Problem. Die miglayout library war irgendwie nicht richtig angebunden. Ich habe sie entfernt und nochmals eingebunden und jetzt funktioniert das. 

Das mit dem Java Build Path ist aber allgemein ein Verständnisproblem von mir. Damit habe ich leider immer wieder Probleme, da ich - und da bin ich ehrlich - es einfach nie wirklich verstanden habe, wie und was ich das alles spezifizieren muss


----------



## ExceptionOfExpectation (9. Nov 2021)

ich habe auch dasselbe Problem, aber ich verwende noch keine Eclipse:
[CODE lang="java" title="TestApp" highlight="24"]package lection4;

import javax.swing.*;
import java.awt.*;
import java.nio.file.Paths;
import java.net.URI;

public class TestApp extends JFrame{

    ImageIcon icon;
    JLabel lab;
    JPanel panel;
    Container contentPane;

    TestApp(){
        setSize(400,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //URI uri = Paths.get(ClassLoader.getSystemResource("D:/java_variable/Swing-Buttons").toURI());
        setVisible(true);
        contentPane = this.getContentPane();
        panel = new JPanel();
        panel.setLayout(new BorderLayout());

        icon = new ImageIcon("/icons/Add16.gif");
        lab = new JLabel(icon);
        panel.add(BorderLayout.CENTER, lab);
        contentPane.add(BorderLayout.CENTER, panel);
    }

    public static void main(String[] args){ new TestApp(); }

}[/CODE]

 der Ordner und Icon.png sind vorhanden, alles im Container eingefügt, wird aber in der Anwendung nicht angezeigt. Habe ich da was übersehen?


----------

