Kriege Graphics.drawImage nicht ans laufen

SpeckHase

Grünschnabel
Hallo,
ich programmiere gerade meine erste Grafik-Ausgabe ohne "StdDraw" und bin da etwas überfordert.

Endziel ist es, ein Spielfeld-Array der Größe 20x20 auszugeben, aber ich kriege noch nicht mal ein normales Bild zum Laufen.
Habe mir via google&co. folgendes zusammengeproggt:

Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Grafik extends JPanel {
	JFrame frame;
	JPanel Spielfeld;
	final public int FeldSize = 30;
	BufferedImage Test;
	File file;
	int hoehe, breite;
	
	public Grafik(){
		frame = new JFrame("Test");
		frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
		frame.setSize(1024,768);
		frame.setPreferredSize(frame.getSize());
		frame.setLocationRelativeTo(null);
		frame.setResizable(false);
		
		this.setSize(FeldSize* 20, FeldSize*20);
		this.setPreferredSize(new Dimension(FeldSize*20, FeldSize*20));
		this.setBackground(Color.WHITE);
		this.setOpaque(false);
		this.setOpaque(false);
		
		Spielfeld = new JPanel();
		Spielfeld.setSize(new Dimension(frame.getSize()));
		Spielfeld.setPreferredSize(new Dimension(frame.getSize()));
		Spielfeld.setLayout(new BorderLayout());
		Spielfeld.setBackground(Color.WHITE);
		Spielfeld.add(this, BorderLayout.EAST);
		
		frame.getContentPane().add(Spielfeld);
		frame.pack();
		frame.setVisible(true);
		
		// file = new File("Bombe.gif");
                // HIER LADE ICH DAS BILD
		java.net.URL pic_url = getClass().getClassLoader().getResource("Bombe.gif");

		try{
			Test = ImageIO.read(pic_url);
			hoehe = Test.getWidth();
			breite = Test.getHeight();
			System.out.println("Hoehe" + hoehe + " Breite " + breite);
		} catch (IOException ioex){
		//	System.out.println("LADEFEHLER");
		}
		
		// Graphics g = Test.getGraphics();
		// g.drawImage(Test, 50,50, this);
	}
	
	protected void paintComponent(Graphics g){
		super.paintComponent(g);

//		g.fillRect(100,100,150,250);

//		g.drawString("This is my custom Panel!",10,20);
		g.drawImage(Test, 5, 5, null);
	}
}

Das soll jetzt auch nur zum Testen sein, das mit dem Spielfeld würde ich später implementieren.
Habe viel im Internet gesucht und da wurde es halt genauso gemacht und ich versteh einfach nicht, wo der Fehler ist.
Das komische ist auch, dass wenn ich die 4.-letzte Zeile mit dem "g.fillRect" wieder mit reinnehme, das Rechteck gezeichnet wird.
Was ich auch nicht so ganz verstehe ist, wie das mit dem "Graphics g" funktioniert. Ich nehme mal an, das ist ein Objekt, das JPanel automatisch initialisiert!?
Habe allerdings in einigen (wenigen) Beispielen gesehen, dass Graphics g nochmal selber erstellt wurde.

Achso und das BufferedImage müsste doch auch fertig geladen sein, er gibt nämlich aus, wie breit bzw hoch das ist.
 

Maddin

Mitglied
Hallo,

zum Zeitpunkt des Aufrufs deiner paint-Methode ist das Bild noch nicht initialisiert. Wenn du dein Fenster runterklappst und wieder maximierst, sollte er etwas zeichnen.
Abhilfe schafft ein simpler repaint am Ende deines Konstruktors.

Gruß
Martin
 

SpeckHase

Grünschnabel
Wow Danke. War ja klar, dass es irgendwie son blöder Fehler war.....und ich verbring hier Stunde um Stunde damit und versteh die Welt nicht mehr ;)

Funktioniert jetzt auf jeden Fall!