# JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source)



## stylegangsta (8. Sep 2015)

Hi zusammen,

habe ein JButton, indem ich ein Bild einfügen will. Habe bei verschieden Recherchen diesen Code entdeckt (mit anderem Bild natürlich)

```
Icon BW_Wappen = new ImageIcon(getClass().getResource("Baden-Wuerttemberg.png"));
btnBW = new JButton(BW_Wappen);
```
und auch auf YouTube mit Beweis, dass es funktioniert. Ich bekomme aber immer folgenden Fehler:

(Die Bilder habe ich in das package wo sich die Klasse AEKFrame befindet kopiert)



> Exception in thread "main" java.lang.NullPointerException
> at javax.swing.ImageIcon.<init>(Unknown Source)
> at ProgrammFenster.AEKFrame.createWidgets(AEKFrame.java:97)
> at ProgrammFenster.AEKFrame.<init>(AEKFrame.java:60)
> at BedienOberFlaeche.main(BedienOberFlaeche.java:26)



Kann mir bitte jemand helfen? Hab keine Idee, weil der gleiche Code in anderen Beipielen funktioniert.


----------



## LatinFavourite (8. Sep 2015)

Aus dem Codeausschnitt lässt sich nicht viel erkennen. Wird das Bild überhaupt geladen?


----------



## stylegangsta (8. Sep 2015)

LatinFavourite hat gesagt.:


> Aus dem Codeausschnitt lässt sich nicht viel erkennen. Wird das Bild überhaupt geladen?


Nein, es wird nicht geladen. Wenn ich aber 
	
	
	
	





```
Icon BW_Wappen = new ImageIcon(getClass().getResource("Baden-Wuerttemberg.png"));
```
 weglasse und btnBW so einfüge:
	
	
	
	





```
btnBW = new JButton("BW");
```
, wird es geladen. Allerdings dann nur mit den Buchstaben BW.

Soll ich mal den gesamten Code posten?


----------



## stylegangsta (8. Sep 2015)

Hier mal der gesamte Code:

```
package ProgrammFenster;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingConstants;

@SuppressWarnings("serial")
public class AEKFrame extends JFrame {

    //Titelgrafik
    private JLabel lblTitelGrafik;

    //Balkenanzeige
    private JProgressBar progFortSchrittsAnzeige;

    //Schaltflächen mit Bundesland Wappen
    private JButton btnBW;

    //Bundesland als Text unter Schaltflächen
    private JLabel lblBW;


    public AEKFrame() {

   
       /*
        * super ("AEK DataBase Reader"); "Programmname: AEK DataBase Reader"
        * setSize(800, 500); "Fenstergröße des Programms: 500px x 500px"
        * setLocationRelativeTo(null); "Sofern kein weiteres Programm bzw. Fenster geöffnet ist"
        * wird das Programmfenster auf dem Bildschirm zentriert
        * setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); "Beendet das Programm (darf nicht gelöscht werden ! ! !)"
        */
        super ("ÄK DataBase Reader");
        setSize(800, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        createWidgets();
        addWidgets();

    }

//    Fenster Elemente
    private void addWidgets() {
        getContentPane().setLayout(null);
        getContentPane().add(lblTitelGrafik);
        getContentPane().add(progFortSchrittsAnzeige);
        getContentPane().add(btnBW);
        getContentPane().add(lblBW);
    }

//    Layout
    /*Titeltext
     * in jedem System vorhande Schriftart, Fett, Kursiv, Größe 30
     * Schriftfarbe rot
     * Titelfeld durchsichtig
     * Hintergrundfarbe weiß
     * Titeltext horizontal zentriert
     * Titelfeld Postion x, y, Breite, Höhe
     */

    private void createWidgets() {
        lblTitelGrafik = new JLabel ("Weiterbildungsdatenbanken der Ärztekammern");
        lblTitelGrafik.setFont(lblTitelGrafik.getFont().deriveFont(Font.BOLD + Font.ITALIC, 30));
        lblTitelGrafik.setForeground(Color.RED);
        lblTitelGrafik.setOpaque(true);
        lblTitelGrafik.setBackground(Color.WHITE);
        lblTitelGrafik.setHorizontalAlignment(SwingConstants.CENTER);
        lblTitelGrafik.setBounds(0, 0, 783, 40);

        progFortSchrittsAnzeige = new JProgressBar(0, 100);
        progFortSchrittsAnzeige.setBounds(0, 442, 784, 20);

//        Buttons: Eigenschaften gelten für jeden Button, postionen ändern sich jedoch
        //Button Baden-Württemberg
        Icon BW_Wappen = new ImageIcon(getClass().getResource("Baden-Wuerttemberg.png"));
        btnBW = new JButton("BW", BW_Wappen);
        btnBW.setBounds(10, 50, 100, 140);
        lblBW = new JLabel ("BW");
        lblBW.setFont(lblBW.getFont().deriveFont(Font.BOLD, 15));
        lblBW.setForeground(Color.BLACK);
        lblBW.setBounds(45, 195, 100, 15);
    }
}
```


----------



## stylegangsta (8. Sep 2015)

Habe jetzt am ButtonCode folgende Änderung vorgenommen:

```
Icon BW_Wappen = new ImageIcon ("Baden-Wuerttemberg.png");
        btnBW = new JButton("BW", BW_Wappen);
        btnBW.setIcon(BW_Wappen);
        btnBW.setBounds(10, 50, 100, 140);
```
Fenster öffnet sich nun ohne Fehlermeldung, aber auch ohne Bild, nur Text


----------



## stylegangsta (8. Sep 2015)

Nach dieser Änderung

```
btnBW = new JButton(new ImageIcon("Baden-Wuerttemberg.png"));
        btnBW.setBounds(10, 50, 100, 140);
        lblBW = new JLabel ("BW");
        lblBW.setFont(lblBW.getFont().deriveFont(Font.BOLD, 15));
        lblBW.setForeground(Color.BLACK);
        lblBW.setBounds(45, 195, 100, 15);
```
fehlt nur das das Wappen.


----------



## LatinFavourite (8. Sep 2015)

Was passiert denn, wenn du ein anderes Bild auf dem Rechner über den Pfad einliest. Besteht das Problem dann auch?


----------



## stylegangsta (8. Sep 2015)

LatinFavourite hat gesagt.:


> Was passiert denn, wenn du ein anderes Bild auf dem Rechner über den Pfad einliest. Besteht das Problem dann auch?



Auf die Idee bin ich noch gar nicht gekommen, ehrlich gesagt. Aber es hat geklappt. Allerdings nur mit dem genauen Pfad auf der Festplatte. Da das Programm später aber auf einem anderen Rechner laufen soll, ist schlecht.
Habe die Datei anschließend zum Testen auch in das Package kopiert und nur den Dateinamen angegeben. Da gings wieder nicht.


----------



## stylegangsta (8. Sep 2015)

GELÖST:
Es reicht einfach nicht aus einfach den Dateinamen anzugeben.

Erst nachdem ich den Pfad so eingegeben habe hats geklappt: 
	
	
	
	





```
btnBW.setIcon(new ImageIcon("src\\ProgrammFenster\\Baden-Wuerttemberg.png"));
```

Jetzt ist nur die Frage, ob das dann Allgemein auf jedem Rechner klappt?


----------



## stylegangsta (8. Sep 2015)

stylegangsta hat gesagt.:


> GELÖST:
> Jetzt ist nur die Frage, ob das dann Allgemein auf jedem Rechner klappt?



Kann ich davon ausgehen, dass der Pfad so Allgemein gültig sein müsste, weil kein Laufwerksbuchstabe davor ist?


----------



## Joose (9. Sep 2015)

stylegangsta hat gesagt.:


> Es reicht einfach nicht aus einfach den Dateinamen anzugeben.



Ist auch klar du kannst in unterschiedlichen Ordner 2 Bilder haben mit jeweils den gleichen Namen, welches sollte er laden wenn man nur den Namen des Bildes angibt? 



stylegangsta hat gesagt.:


> Jetzt ist nur die Frage, ob das dann Allgemein auf jedem Rechner klappt?





stylegangsta hat gesagt.:


> Kann ich davon ausgehen, dass der Pfad so Allgemein gültig sein müsste, weil kein Laufwerksbuchstabe davor ist?



Hier mal ein Link zu diesem Thema (etwas allgemeiner gefasst) http://stackoverflow.com/questions/...y-get-image-from-resources-folder-in-netbeans


----------



## stylegangsta (9. Sep 2015)

@Joose, vielen Dank für den Link


----------



## stylegangsta (9. Sep 2015)

Hab hier im Forum jetzt ein Thread gefunden, dass man es über den classloader machen muss. Hab auch den Code entprechend mit Pfadangabe usw angepasst. Wird auch so angezeigt, wie ich es haben will, aber sobald ich das Programm in eine JAR Datei exportiere und ich es mit Doppelklick starten will passiert nichts. Kommt beim Exportieren aber auch keine Fehlermeldung.
Hier mal der Code: Habe die zwei stellen im Code durch Trennlinien hervorgehoben

```
package ProgrammFenster;

import java.awt.Color;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingConstants;

@SuppressWarnings("serial")
public class AEKFrame extends JFrame {

    // Titelgrafik
    private JLabel lblTitelGrafik;

    // Anzeige Fortschrittsbalken
    private JProgressBar progFortSchrittsAnzeige;

    // Schaltflächen mit Bundesland Wappen
    private JButton btnBW;
------------------------------------------
    BufferedImage BW_Wappen;
-------------------------------------------


    // Bundesland als Text unter Schaltflächen
    private JLabel lblBW;

    public AEKFrame() {

        /*
         * super ("AEK DataBase Reader"); "Programmname: AEK DataBase Reader"
         * setSize(800, 500); "Fenstergröße des Programms: 500px x 500px"
         * setLocationRelativeTo(null);
         * "Sofern kein weiteres Programm bzw. Fenster geöffnet ist" wird das
         * Programmfenster auf dem Bildschirm zentriert
         * setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         * "Beendet das Programm (darf nicht gelöscht werden ! ! !)"
         */
        super("ÄK DataBase Reader");
        setSize(800, 500);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        createWidgets();
        addWidgets();

    }

    // Fenster Elemente
    private void addWidgets() {
        getContentPane().setLayout(null);
        getContentPane().add(lblTitelGrafik);
        getContentPane().add(progFortSchrittsAnzeige);
        getContentPane().add(btnBW);
        getContentPane().add(lblBW);
    }

    // Layout
    /*
     * Titeltext in jedem System vorhande Schriftart, Fett, Kursiv, Größe 30
     * Schriftfarbe rot Titelfeld durchsichtig Hintergrundfarbe weiß Titeltext
     * horizontal zentriert Titelfeld Postion x, y, Breite, Höhe
     */

    private void createWidgets() {
        lblTitelGrafik = new JLabel(
                "Weiterbildungsdatenbanken der Ärztekammern");
        lblTitelGrafik.setFont(lblTitelGrafik.getFont().deriveFont(
                Font.BOLD + Font.ITALIC, 30));
        lblTitelGrafik.setForeground(Color.RED);
        lblTitelGrafik.setOpaque(true);
        lblTitelGrafik.setBackground(Color.WHITE);
        lblTitelGrafik.setHorizontalAlignment(SwingConstants.CENTER);
        lblTitelGrafik.setBounds(0, 0, 783, 40);

        progFortSchrittsAnzeige = new JProgressBar(0, 100);
        progFortSchrittsAnzeige.setBounds(0, 442, 784, 20);

        // Buttons: Eigenschaften gelten für jeden Button, Positionen ändern
        // sich jedoch
        // Button Baden-Württemberg
----------------------------------------------------------
        try {
        BW_Wappen = ImageIO.read(getClass().getResource("/Baden-Wuerttemberg.png"));
        }
        catch(IOException ex) {
        System.out.println("Ausnahmefehler beim Laden einer Grafik!\nEine Grafik konnte nicht gelesen werden!");
        ex.printStackTrace();
        }
        catch(IllegalArgumentException ex) {
        System.out.println("Ausnahmefehler beim Laden einer Grafik!\nEine Grafik wurde nicht gefunden!");
        ex.printStackTrace();
        }
-----------------------------------------------------
        btnBW = new JButton();
        btnBW.setIcon(new ImageIcon(BW_Wappen));
        btnBW.setHorizontalAlignment(SwingConstants.CENTER);
        btnBW.setVerticalAlignment(SwingConstants.CENTER);
        lblBW = new JLabel("BW");
        lblBW.setFont(lblBW.getFont().deriveFont(Font.BOLD, 15));
        lblBW.setForeground(Color.BLACK);
        lblBW.setHorizontalAlignment(SwingConstants.CENTER);
        lblBW.setVerticalAlignment(SwingConstants.CENTER);
        lblBW.setBounds(10, 130, 110, 140);
        btnBW.setBounds(10, 50, 110, 140);

    }
}
```


----------



## Joose (9. Sep 2015)

Wenn du die JAR durch Doppelklick startest kannst du auch keine Fehlermeldungen sehen ... diese werden auf die Konsole geschrieben, da diese aber beim Doppelklick nicht angezeigt wird sieht man eben nichts.
Starte das JAR von der Konsole aus, dann solltest du auch mögliche Fehlermeldungen sehen.


----------



## thet1983 (9. Sep 2015)

ich tippe mal stark auf eine IO Exeption

```
BW_Wappen = ImageIO.read(getClass().getResource("/Baden-Wuerttemberg.png"));
```

mach mal so:

```
BW_Wappen = ImageIO.read(/*KlassenName*/.class.getClassLoader().getResourceAsStream("/Baden-Wuerttemberg.png"));
```


----------



## stylegangsta (9. Sep 2015)

Joose hat gesagt.:


> Wenn du die JAR durch Doppelklick startest kannst du auch keine Fehlermeldungen sehen ... diese werden auf die Konsole geschrieben, da diese aber beim Doppelklick nicht angezeigt wird sieht man eben nichts.
> Starte das JAR von der Konsole aus, dann solltest du auch mögliche Fehlermeldungen sehen.



Ich weiß gar nicht wie das geht, ehrlich gesagt. Aber eine andere Feststellung habe ich gemacht. Ich arbeite ja am Rechner zu Hause und auch in der Schule. Also kopiere ich die aktualisierten Codes hin und her per Email oder von hier.

Dass das Programm als JAR-Datei mit Doppelklick gar nicht erst gestartet ist war in der Schule. Sprich der Code, den ich oben angegeben hatte. Jetzt habe ich den Code von oben, also Schule, bei mir zu Hause eingefügt und eine JAR-Datei draus gemacht. Startet Einwandfrei, samt dem Wappen, was angezeigt werden soll.

Ist so was möglich. Hat eclipse evtl. Macken, die Rechnerabhängig sind. Denn ich glaube kaum, dass es an der Rechnerleistung liegt bei einem 6KB png Bild.


----------



## thet1983 (9. Sep 2015)

wo liegen den deine bilder? 
ich denke nicht auf dem selben pfad....oder?


----------



## stylegangsta (9. Sep 2015)

thet1983 hat gesagt.:


> wo liegen den deine bilder?
> ich denke nicht auf dem selben pfad....oder?


Alle im Source Ordner. 
Außer dem Java-Projektnamen ist alles exakt gleich. Ich glaube, sogar den habe ich mittlerweile auch gleich, bin mir nicht Sicher


----------



## thet1983 (9. Sep 2015)

lies mal die beiden methoden nach 
--> 
	
	
	
	





```
getResource()
```
 und 
	
	
	
	





```
getResourceAsStream()
```


----------



## stylegangsta (9. Sep 2015)

thet1983 hat gesagt.:


> lies mal die beiden methoden nach
> -->
> 
> 
> ...


Bin nicht wirklich Schlau daraus geworden, aus dem was ich gefunden habe. Sorry.
Ich weiß nur, dass getResourceAsStream() nicht funktioniert hatte heute Vormittag.


----------



## stylegangsta (10. Sep 2015)

stylegangsta hat gesagt.:


> Ich weiß gar nicht wie das geht, ehrlich gesagt. Aber eine andere Feststellung habe ich gemacht. Ich arbeite ja am Rechner zu Hause und auch in der Schule. Also kopiere ich die aktualisierten Codes hin und her per Email oder von hier.
> 
> Dass das Programm als JAR-Datei mit Doppelklick gar nicht erst gestartet ist war in der Schule. Sprich der Code, den ich oben angegeben hatte. Jetzt habe ich den Code von oben, also Schule, bei mir zu Hause eingefügt und eine JAR-Datei draus gemacht. Startet Einwandfrei, samt dem Wappen, was angezeigt werden soll.
> 
> Ist so was möglich. Hat eclipse evtl. Macken, die Rechnerabhängig sind. Denn ich glaube kaum, dass es an der Rechnerleistung liegt bei einem 6KB png Bild.



Die JAR-Datei, die ich mit dem Code aus der Schule zu Hause erstellt habe, habe ich heute morgen auf dem Rechner in der Schule ausprobiert. Läuft Einwandfrei, aber wenn ich den gleichen Code mit dem Eclipse (Zu Hause und in der Schule selbe eclipse Version) in eine JAR-Datei exportiere läuft es nicht.

Ich habe es auch zur Sicherheit noch zusätzlich auf einem anderen Rechner ausprobiert. Die zu Hause erstellte JAR-Datei lief auch auf dem Rechner.

Echt Merkwürdig.

Es kam schon zwei mal vor, dass wenn man eclipse mit dem Kontext "Hier entpacken" entpackt hat, es nicht vollständig entpackt wurde. Aber mit "Alle entpacken" und anschließender Pfadauswahl wurde es vollständig entpackt.
In diesem Fall wurde es aber vollständig entpackt.

Woran könnte das liegen? eclipse dennoch Fehlerhaft entpackt vielleicht?


----------



## thet1983 (11. Sep 2015)

welche java version?
jre?

wenn das auch gleich ist dann würde ich mal eclipse komplett entfernen und wieder neu installieren

--> cmd öffnen und 
	
	
	
	





```
java -version
```
 eingeben


----------



## stylegangsta (11. Sep 2015)

thet1983 hat gesagt.:


> welche java version?
> jre?
> 
> wenn das auch gleich ist dann würde ich mal eclipse komplett entfernen und wieder neu installieren
> ...


1.8.0_45


----------



## thet1983 (11. Sep 2015)

hmmm, dann bin ich überfragt...
das mit der version hätte noch sein können aber sonst weiß ich jetzt auch nicht...sry


----------



## stylegangsta (11. Sep 2015)

Vielen Dank, werde mal am Montag eclipse komplett neu einrichten hier in der Schule und mal sehen was ist.


----------

