Swing ImageIcon lädt kein Bild

cool_brivk24

Mitglied
Hallo liebe programmierer:


Ich Poste erst den Fehlercode, dann den code.

Ich habe mich für die JLabel Methode entschieden:

Wenn ich versuche ein JLabel mit einem ImageIcon zu laden, bekomme ich diesen Fehler:

Code:
Exception in thread "main" java.lang.NullPointerException
    at java.awt.Container.addImpl(Unknown Source)
    at java.awt.Container.add(Unknown Source)
    at de.coolbrick.catan.gui.Window.<init>(Window.java:33)
    at Main.<init>(Main.java:23)
    at Main.main(Main.java:33)

In meiner Window Zeile 33 steht:
Java:
public Window() {
       JPanel p = new JPanel();
       
       p.add(l1);
       p.setBackground(new Color(0, 162, 232));//Zeile 32
//Zeile 33, die ist leer

In meiner Main auf Zeile 23 und 33 steht:
Java:
//Zeile 23        jf.add(new Window());

public static void main(String[] args) {
       new Main();    //Zeile 33
       Window w = new Window();
       new SelectedMapTile();
   }

Nun, hier ist mein code der Window Klasse:
Java:
public JLabel l1;
   
   
   public Window() {
       JPanel p = new JPanel();
       
       p.add(l1);
       p.setBackground(new Color(0, 162, 232));
       
   
       }
   public void paintComponent(Graphics g) {
       BufferedImage map = LoadImage("img/Map/FirstTestMap.png");       
       BufferedImage area = LoadImage("img/Map/Area.png");
       
       BufferedImage forest = LoadImage("img/Map/MapTiles/Wald.png");
       BufferedImage water = LoadImage("img/Map/MapTiles/Wasser.png");
       BufferedImage grass = LoadImage("img/Map/MapTiles/Rasen.png");
       BufferedImage mountain = LoadImage("img/Map/MapTiles/Berg.png");
       
        ImageIcon icon = new ImageIcon (map);
         l1 = new JLabel (icon);
         
       
       
       Graphics2D g2d = (Graphics2D) g;
(Dies ist nur ein Teil der Window Klasse)

Was ich machen wollte, ist ein JLabel zu erzeugen was ein Bild hat. Dieses JLabel wird dann richtig positioniert.

Also
Java:
public JLabel lb1;
public ImageIcon bild;

bild = new ImageIcon("img/Map/Area.png")
lb1 = new JLabel(bild);

jpanel.add(lb1);

Leider weiß ich nicht weiter.

Ich hoffe auf eure Antworten

mfusdg (Mit Freundlichen und sehr dankbaren grüßen)

-cool_brick24
 
Schau doch mal ob LoadImage(..) nicht doch NULL zurück gibt, weil das Bild nicht geladen werden kann. Stimmt der Pfad denn? Was macht die LoadImage Methode?

OT: Du solltest in paintComponent() keine Variablen anlegen / initialisieren. Bilder, Komponenten, .. müssen nur einmal erstellt werden
 
Der Fehler ist, dass du im Konstruktor l1 dem Panel hinzufügst, l1 an der Stelle aber noch null ist.

Abgesehen davon ist der Code aber noch ... sehr verbesserungswürdig.
- du erstellst mindestens 2 Window-Objekte (in main(...) und in Main())
- Window sollte weiterhin *keine* Component sein, oder zumindest anders heißen
- Window#paintComponent ist vermutlich immer noch völlig überflüssig. das was drin ist, gehört in jedem Fall nicht rein


Ganz allgemeiner Rat: Erst die Grundlagen drauf haben, dann erst GUI-Programmierung.
 
Ich habe jetzt mal meine Klassen gelöscht und will es auf einen besseren, übersichtlicheren Weg machen.
Also habe ich jetzt 2 Klassen.
Klasse 1: Main
Klasse 2: Draw

Main:
Java:
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;



public class Main extends JFrame{
   

    private static final long serialVersionUID = 1L;

    public Main(){
        JFrame jf = new JFrame();
        Draw d = new Draw();
        JPanel p = new JPanel();
       
       
        jf.setSize(900, 700);
        jf.setTitle("MineCatan");
        jf.setResizable(false);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setLocationRelativeTo(null);
        jf.setBackground(new Color(0, 162, 232));
        jf.requestFocus();
       
        p.add(d.Map);
        p.add(d.Area);
        //p.setBackground(new Color(0, 162, 232));
       
       
        jf.add(p);
        jf.setVisible(true);
    }

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

}

Draw:
Java:
import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class Draw{
    public JLabel Map;
    public ImageIcon forMap;
    public JLabel Area;
    public ImageIcon forArea;
   
    public Draw(){
        forMap = new ImageIcon("img/Map/Map.png");
        Map = new JLabel(forMap);
        forArea = new ImageIcon("img/Map/Area.png");
        Area = new JLabel(forArea);
    }
}

Nur wenn ich die Map in meiner Main hinzufüge, sehe ich mein Bild. Danach füge ich meine Area hinzu. Jetzt sehe ich nur die Map. Also ist warscheinlich die Area im Hintergrund gezeichnet. Kann mir da jemand zufällig helfen?

mfusdg

-cool_brick24
 
Das ist ja mal ein Anfang 🙂 Mal weiter gefragt: wofür brauchst Du die verschiedenen Bilder bzw. kannst Du diese nicht vorher zu einem Bild zusammensetzen?
 
Du meinst ein Spritesheet? Ein SpriteSheet hatte ich zwar erstellt, fande es aber besser mehrere Blöcke(Felder) zu haben. Also: Forest; Mountain; Grass; Sea. Ich möchte diese ja auch unterschiedlich platzieren, also man kann eine TXT Datei erstellen, in der man Zahlen angibt, wie das Feld aufgebaut ist.

mfg

-cool_brick24
 
Du meinst ein Spritesheet?
Nein. Wenn ich von Bergen, Wald, Wiesen und Seen lese, dann assoziiere ich damit erst einmal ein statisches Bild, das z. B. im Hintergrund angezeigt werden soll. Insofern frage ich mich, warum man dieses Bild nicht vorab erzeugt.

Machen wir das mal konkret: wenn wir ein klassisches Brettspiel nehmen, dann ist dieses statisch. Dann kann ich dieses vorab als Bild ablegen (spielbrett.jpg) und muss in der Anwendung überhaupt nix mehr machen.

Wenn ich mir das Spielbrett hier (https://www.spiele-offensive.de/index.php?cmd=artikel_anzeigen&aid=1004651&curpic=1) ansehe, dann kann ich es mir zwar zusammenstellen, aber es dürfte sich trotzdem noch um eine relativ statische Angelegenheit handeln.

In paintComponent käme dann einfach ein Zeichnen des Spielbretts (Laden der Bilder gehört da sowieso nicht rein) sowie der Figuren an der jeweils aktuellen Position.
 

Zurück
Oben