AWT BufferedImage wird nicht geladen

cool_brivk24

Mitglied
Hallöchen liebe Programmier:

Ich programmiere derweil eine Anwendung und möchte ein Bild laden. Natürlich ist das so einfach, dass Onkel Google eine Lösung hat. Doch nicht für mein Problem. Meine Inkompetenz hat zugeschlagen:

Ich habe eine extra Klasse ( Window.java ) in der ich mein Window programmiere. Ich habe auch ein HintergrundBild mit einem JLabel hinzugefügt ( Hatte erstmals nichts anderes auf dem ersten Blick gefunden ). Jetzt wollte ich ein Bild in der Mitte haben, dieses soll aber einzeln gezeichnet werden. Natürlich mit paintComponent. Doch:

Java:
package de.coolbrick.catan.gui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Window extends Component{
   private static final long serialVersionUID = 1L;
   
   
   JLabel map;
   Icon icon1;
   
   
   
   public Window() {
       JFrame jf = new JFrame();

       jf.setSize(900, 700);
       jf.setTitle("...");
       jf.setResizable(false);
       jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       jf.setLocationRelativeTo(null);
       jf.setBackground(new Color(0, 162, 232));
       
       
       
       icon1 = new ImageIcon("img/Map/FirstTestMap.png");
       map = new JLabel(icon1);
       
       
       jf.add(map);
       
  
       jf.setVisible(true);
       
       
           
       }


   public void paintComponent(Graphics g) {
       AffineTransform at = AffineTransform.getTranslateInstance(100, 100);
       BufferedImage area = LoadImage("img/Map/Area.png");
       
       Graphics2D g2d = (Graphics2D) g;
       
       g2d.drawImage(area, at, null);
   }
   
   BufferedImage LoadImage(String FilePath){
       
       BufferedImage img = null;
       
       try {
           img = ImageIO.read(new File(FilePath));
       } catch (IOException e) {
           e.printStackTrace();
           throw new RuntimeException("" + FilePath + " konnte nicht geladen werden!!!");
       }
       
       return img;
       
   }
   

   

}

Doch mein paintComponent wird nicht aufgerufen. (Die Klasse Window.java ist nicht meine Main Klasse)

Ich bin zu inkompetent um den Fehler zu finden.

Mfg
-cool_brick24
 
Annotiere mal Deine paintComponent-Methode mit
Code:
@Override
. Wenn Dir dann was auffällt, schau mal in die JavaDocs zu Component und JComponent 😉
 
Das steht ich solle "@Override" entfernen. Und wenn ich mir die JavaDocs anschauen möchte, steht da, dass diese nicht gefunden werden konnten. Außerdem hatte ich den Component versehentlich drinne gelassen.
 
Kurz: Du musst von JComponent ableiten (Component kennt kein paintComponent, daher wird es auch nicht aufgerufen).
 
Danke. Jetzt steht da nicht mehr "ich solle das "@Override" entfernen" aber das Bild wird immer noch nicht geladen.
Mein aktueller Stand:
Java:
package de.coolbrick.catan.gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Window extends JComponent{
   /**
    *
    */
   private static final long serialVersionUID = 1L;
   JLabel map;
   Icon icon1;
   
   
   
   public Window() {
       JFrame jf = new JFrame();

       jf.setSize(900, 700);
       jf.setTitle("Minecraft Catan");
       jf.setResizable(false);
       jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       jf.setLocationRelativeTo(null);
       jf.setBackground(new Color(0, 162, 232));
       
       
       
       icon1 = new ImageIcon("img/Map/FirstTestMap.png");
       map = new JLabel(icon1);
       
       
       jf.add(map);
       
       
       //Muss immer am Ende stehen
       jf.setVisible(true);
       
       
           
       }
   @Override
   public void paintComponent(Graphics g) {
       AffineTransform at = AffineTransform.getTranslateInstance(100, 100);
       BufferedImage area = LoadImage("img/Map/Area.png");
       
       Graphics2D g2d = (Graphics2D) g;
       
       g2d.drawImage(area, at, null);
   }
   
   BufferedImage LoadImage(String FilePath){
       
       BufferedImage img = null;
       
       try {
           img = ImageIO.read(new File(FilePath));
       } catch (IOException e) {
           e.printStackTrace();
           throw new RuntimeException("" + FilePath + " konnte nicht geladen werden!!!");
       }
       
       return img;
       
   }
   
   

}

Ich habe immer noch keine Ahnung.

Mfg
-cool_brick24

PS: Ich schreib in 20 Minuten zurück
 
Wenn Du keine Exception bekommst, probier mal
Java:
g.drawImage(area, 100, 100, null);
 
@mrBrown wie meinst du das genau? Ich erstelle ja in der Windows Klasse eine Methode, die ich in meiner Main Aufrufe mit
Java:
new Window();
oder
Java:
Window w = new Window();

@mihe7 der Code-Tag funktioniert leider auch nicht. Aber ich habe eine Idee woran das liegen könnte. Gibt es in Java eine Hintergrund Ebene? Denn es kann sein dass mein Jlabel im Vordergrund steht und das BuffereeImage im Hintergrund gezeichnet wird.

Mfg
-cool_brick24
 
@cool_brivk24 was @mrBrown meint (und ich völlig übersehen habe 🙄) ist, dass im Konstruktor theoretisch ein jf.add(this); fehlt. Allerdings ist es keine gute Idee, eine halbkonstruierte Komponente einem Container hinzuzufügen...
 
Okay, trozdem danke. Kann ich es vielleicht so machen?:
Java:
 //Window.java
@Override
public void paintComponent drawArea(Graphics g){
.......
}
//Main.java
Window w = new Window();
w.drawArea(g);
Ich vermute, dass das nicht funktioniert denn in der Funktion muss ich ja Graphics g angeben.

Trozdem vielen dank für die antworten. Ich probieres es weiter.

mfg

-cool_brick24
 
Ich habe es jetzt so gelöst wie mihe7 es gesagt hatte. Vielleicht ist dies ein Weg der micht weiterbringt. Naja, trozdem vielen dank an euch. Mein aktueller Stand der Dinge:
Java:
package de.coolbrick.catan.gui;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Window extends JComponent{
   /**
    *
    */
   private static final long serialVersionUID = 1L;
   
   
   
   
   public Window() {
       JFrame jf = new JFrame();

       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.add(this);
       
       
       
       
       //Muss immer am Ende stehen
       jf.setVisible(true);
       
       
           
       }
   @Override
   public void paintComponent(Graphics g) {
       BufferedImage map = LoadImage("img/Map/FirstTestMap.png");       
       BufferedImage area = LoadImage("img/Map/Area.png");

       
       Graphics2D g2d = (Graphics2D) g;
       
       g.drawImage(map, 0, 0, null);
       g.drawImage(area, (int) 7.5f, 30, null);
   }
   
   BufferedImage LoadImage(String FilePath){
       
       BufferedImage img = null;
       
       try {
           img = ImageIO.read(new File(FilePath));
       } catch (IOException e) {
           e.printStackTrace();
           throw new RuntimeException("" + FilePath + " konnte nicht geladen werden!!!");
       }
       
       return img;
       
   }
   
   

}

Mit dankbaren und freundlichen grüßen:

-cool_brick24

PS: Schönen Mittag noch
 
Das Problem ist, dass Deine Window-Objekte zu viel machen: Du versuchst, UI und Komponente zu vereinen.

Window soll, wenn ich es richtig verstehe, ein Anwendungsfenster aufbauen, dabei soll ein Panel verwendet werden, das im Hintergrund ein Bild anzeigt.
1. Der Bezeichner "Window" ist nicht gut -> zu allgemein.
2. Die Klasse Window kannst Du Dir ganz sparen

Du brauchst eher etwas in der Art (ungetestet):

Java:
public class ImagePanel extends JComponent {
    private BufferedImage backgroundImage;
    public void setBackground(BufferedImage img) {
        backgroundImage = img;
        repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Insets insets = getInsets();
        if (backgroundImage != null) {
            g.drawImage(backgroundImage, insets.left, insets.top, null);
        }
    }      
}

Java:
public class App {
    private void run() {
        BufferedImage area = loadImage("img/Map/Area.png"); 
        ImagePanel panel = new ImagePanel();
        panel.setBackground(area);
        // weitere Komponenten hinzufügen
        // panel.add(...) 
        JFrame frame = new JFrame();
        // frame konfigurieren...
        frame.add(panel);
        frame.setVisible(true);     
    }

    private BufferedImage loadImage(String path) {
        ...
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new App().run());
    }
}
 

Zurück
Oben