Swing Hintergrundbild in einen JFrame einfügen

  • Themenstarter Themenstarter Hanna
  • Beginndatum Beginndatum
H

Hanna

Gast
Hallo,
ich versuche schon den ganzen Tag einem einfachen JFrame ein Hintergrundbild zu verpassen.

Meine JFrame-Klasse:

Java:
 public class MainFrame extends JFrame implements WindowListener, ActionListener{
public MainFrame() {
	super("Heading");
	setSize(493, 370);
	setVisible(true);
	addWindowListener(this);
	setLayout(new GridLayout(1, 1));
	
	BackgroundPanel PBackground = new BackgroundPanel(new BorderLayout());
	Graphics g = (Graphics) getGraphics();
	PBackground.paint(g);
	
        PBackground.setVisible(true);
	PBackground.add(new JLabel("lala"), BorderLayout.PAGE_START);
	
	add(PBackground);
}
}

Meine BackgroundPanel-Klasse:


Java:
public class BackgroundPanel extends JPanel {

	private static final long serialVersionUID = 1L;
	private Image img;
	
	public BackgroundPanel(LayoutManager layout) {
		super(layout);
		img = Toolkit.getDefaultToolkit().getImage(/...bild.jpg);
		
	}
	
	public void paint(java.awt.Graphics g) {
		super.paint(g);
		g.drawImage(img, 0, 0, this);
	}

}


Also das hab ich mir irgendwie aus tausend verschiedenen Foreneinträgen zusammengesucht und mit allen möglichen Prozeduren rumprobiert aber es kam einfach nix bei raus... ich glaub dass ich auch das mit dem paint(g) noch nicht richtig verstanden habe... oder kann das sein dass ich vielleicht noch so eine Art AD-ON brauche, dass mein Programm überhaupt Grafiken anzeigen kann? Ich weiß echt nicht mehr was ich noch probieren soll, bitte helft mir weiter... 🙂
 
In deiner Version würdest du eh mehrere Compiler Fehler bekommen. Ich hab dir mal eine kleine Version zusammengebaut, wie man das umsetzen könnte.

In meinem Fall liegt das Bild direkt in dem src Ordner.

Ich hab beide Klassen in eine File gepackt, musst du halt dann einfach wieder trennen. 🙂

Schöne Grüße

Java:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JavaSchulung extends JFrame {
	public JavaSchulung() {
		super("Heading");

		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		BackgroundPanel backgroundPanel = new BackgroundPanel();
		add(backgroundPanel);

		setSize(backgroundPanel.getBackgroundImage().getWidth(backgroundPanel),	backgroundPanel.getBackgroundImage().getHeight(backgroundPanel));
	}

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

class BackgroundPanel extends JPanel {

	private static final long serialVersionUID = 1L;
	private Image img;

	public BackgroundPanel() {

		try {
			img = ImageIO.read(getClass().getResource("gamePanel.jpg"));
			System.out.println("Picture loaded.");
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("Picture was not found.");
		}
	}

	@Override
	protected void paintComponent(Graphics g) {
		// TODO Auto-generated method stub
		super.paintComponent(g);
		g.drawImage(img, 0, 0, this);

	}

	public Image getBackgroundImage() {
		return img;
	}

}
 
Der Aufruf
Code:
setVisible(true)
auf dem JFrame sollte immer erst zum Schluss kommen, wenn der ganze JFrame fertig aufgebaut ist, sonst kann es passieren, dass Teile davon nicht angezeigt werden!

Variablennamen werden immer mit kleinem Anfangsbuchstaben geschrieben:
Code:
PBackground -> pBackground

Den folgenden Code solltest Du löschen:
Java:
Graphics g = (Graphics) getGraphics();//hat hier keine Daseinsberechtigung
pBackground.paint(g);//paint wird niemals direkt aufgerufen!
pBackground.setVisible(true);//nicht verkehrt, aber überflüssig

Die
Code:
getImage
Methode vom
Code:
Toolkit
ladet das Bild nicht sofort! Das Bild laden wir am einfachsten so:
Java:
ImageIcon imageIcon = new ImageIcon(getClass().getResource("bild.jpg"));
img = imageIcon.getImage();
Der Aufruf
Code:
getClass().getResource(..)
ist notwendig, wenn das Bild später zusammen mit der Anwendung in eine jar-Datei gepackt werden soll.

Siehe auch Malen in Swing Teil 1: der grundlegende Mechanismus

Gruß,
André
 
Ok, ich habs jetzt mal so gemacht wie Fab1 es gemacht hat, war die erste Antwort und hat sogar funktioniert 🙂 DANKE!!! Nur jetzt hab ich ein neues Problem... :
Ich hab jetzt auf dieses Bild-Panel noch Buttons draufgelegt und die transparent gemacht. das funktioniert auch, nur leider nur manchmal! Das heißt ich lasse mein Programm laufen und die Buttons werden angezeigt, ich beende das Programm und starte es neu und die Butons fehlen (ohne dass ich irgendwas im Code verändert habe). u.s.w.
Ist da einfach nur mein Computer mit der Anzeige überfordert (wobei ich mir das nicht vorstellen kann, soo heftig ist das ja auch nicht...) oder kann das auch am Code liegen?
 
Ich denke das Problem ist, dass setVisible(true) zu früh aufgerufen wird.

Ich denke darauf spekuliert L-ectron-X auch, würde ich zumindest so aus der Frage deuten. 🙂

Falls das der Fall sein kann, kannst du, falls du den Code von mir nicht groß verändert hast, den JFrame mal so aufrufen.

Java:
public static void main(String[] args) {
        new JavaSchulung().setVisible(true); // Statt JavaSchulung dein Klassenname
    }

Dadurch werden die Komponenten erst alle geladen und anschließend wird erst das Fenster angezeigt.
 

Zurück
Oben