Bild als Hintergrund in einem Swing Fenster

  • Themenstarter Themenstarter KlemensyXYZ
  • Beginndatum Beginndatum
K

KlemensyXYZ

Gast
Moin,
ich versuche grade ein Bild als Hintergrund in einem Swing Fenster zu setzten.

Habe unter anderem das hier probiert:
Java:
public class HauptmenueHintergrund extends JFrame
{
	@SuppressWarnings("deprecation")
	public HauptmenueHintergrund()
	{
		super("hintergrung");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocation(0,0);
        this.resize(Toolkit.getDefaultToolkit().getScreenSize());
        
        public void paint(Graphics g) 
        {
            Image img = Toolkit.getDefaultToolkit().createImage("was-sind-sterne.jpg");
            g.drawImage(img,0,0,null);
        }
	}		
}

und das:
Java:
import java.awt.Toolkit;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class HauptmenueHintergrund extends JFrame
{
	@SuppressWarnings("deprecation")
	public HauptmenueHintergrund()
	{
		super("hintergrung");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocation(0,0);
        this.resize(Toolkit.getDefaultToolkit().getScreenSize());
        
        String backgroundImageFileName = "was-sind-sterne.jpg";
        try 
        {
            JLabel picture = new JLabel(new ImageIcon(ImageIO.read(this.getClass().getClassLoader().getResourceAsStream(backgroundImageFileName))));
        } 
        
        catch (IOException e) 
        {
            e.printStackTrace();
        }
	}		
}

doch nichts davon funktioniert.
Was mach ich noch falsch?
 
Ersteres kann nicht funktionieren, da eine Methode (bzw. der Konstruktor) keine "Untermethode" enthalten kann. Zweiteres funktioniert nicht, da das JLabel ja zu keinen Container (JFrame/Contentpane) hinzugefügt wird.
Ich würde dir empfehlen, ein JLayeredPane zu nehmen und dem ContentPane hinzuzufügen. Das hat die Möglichkeit sehr viele Panels zu beinhalten. Damit kannst du den Background an die unterste Ebene hinzufügen, damit er später den anderen Komponenten nicht im Weg ist, wenn sie z. B. Ebenen wechseln müssen.
 
Hallo KlemensyXYZ,

vielleicht hilft dieses Beispiel: Hintergrundbild

wenn ich den Pfad durch meinen ersetze bekomme ich den Fehler:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(Unknown Source)
	at spiel.ImageDemo.<init>(ImageDemo.java:16)
	at spiel.ImageDemo$1.run(ImageDemo.java:39)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
ich gehe mal davon aus das er mein Bild nicht findet oder?

Bei einer Suche im Internet sollte man eigentlich unzählige Beispiele finden.

Was meinste denn woher ich diese Ideen habe 😀

Damit kannst du den Background an die unterste Ebene hinzufügen, damit er später den anderen Komponenten nicht im Weg ist, wenn sie z. B. Ebenen wechseln müssen.

Eigentlich sollten auf diesem Hintergrund (erstmal) nichts anderes sein als das Bild
werde das trotzdem mal ausprobieren (ist das nicht dasselbe wie im vom Post von André Uhres ?)
 
Er findet das Bild wahrscheinlich nicht. Wie ist denn deine Verzeichnisstruktur?

Mein Beispiel benutzt kein Layeredpane. Der Hintergrund ist einfach ein JLabel, das als Contentpane dient. Das dürfte auch in deinem Fall genügen.

Gruß,
André
 
Wie ist denn deine Verzeichnisstruktur?

Das Bild liegt direkt im Eclipse Projekt, in diesem Fall:

D:\JavaProgramme\Eclipse_Workspace\Bild_als_Hintergrund

dort habe ich immer die Dateien abgelegt auf die ich mit Java Programmen zugreifen wollte.
Ich habe es mit folgenden Pfaden versucht:
1.
Java:
ImageIcon backgroundImage = new ImageIcon(getClass().getResource("D:\JavaProgramme\Eclipse_Workspace\Bild_als_Hintergrund\sterne.jpg"));
2.
Java:
ImageIcon backgroundImage = new ImageIcon(getClass().getResource("sterne.jpg"));
3.
Java:
ImageIcon backgroundImage = new ImageIcon(getClass().getResource("D:/JavaProgramme/Eclipse_Workspace/Bild_als_Hintergrund/sterne.jpg"));
4.
Java:
ImageIcon backgroundImage = new ImageIcon(getClass().getResource("D.JavaProgramme.Eclipse_Workspace.Bild_als_Hintergrund.sterne.jpg"));
 
Am Besten ist, du gibts es direkt ins Projektverzeichnis, wenn du Eclipse verwendest wäre das der Ordner, in dem die Ordner src und bin liegen. Dort kannst du es relativ per new ImageIcon("") laden. Oder per getRessource aus den bin-Ordner, dafür muss der Pfad aber mit / beginnen. Also "/sterne.png".

Die Erste Möglichkeit läd bei einer jar dann die Dateien aus dem selben Ordner wie die jar, die Zweite direkt aus der jar.
 
Am Besten ist, du gibts es direkt ins Projektverzeichnis, wenn du Eclipse verwendest wäre das der Ordner, in dem die Ordner src und bin liegen.
dort liegt die Datei
Dort kannst du es relativ per new ImageIcon("") laden. Oder per getRessource aus den bin-Ordner, dafür muss der Pfad aber mit / beginnen. Also "/sterne.png".
ok werde ich versuchen
Die Erste Möglichkeit läd bei einer jar dann die Dateien aus dem selben Ordner wie die jar, die Zweite direkt aus der jar.
ich habe keine jar Datei und (eigentlich) auch nicht vor so eine zu erstellen
 
Ich weiß, blöde Frage, aber passiert mir oft: Bist du sicher, dass es ein jpg ist, und du es nicht nur z. B. in Paint gezeichnet aber als bmp unter *.jpg abgespeichert hast?
 
oh sorry hatte da noch nen tippfehler übersehen 😳
zwei buchstaben vertauscht😉
ginbts da noch ne möglichkeit das Bild mit der Größe des Fenster zu verändern?
So dass es zB bei Vollbild auch das ganze Bild ausfüllt und nich nur die fläche der usprünglichen Auflösung?
 
Zuletzt bearbeitet von einem Moderator:
Gibt es. In diesen Fall würde ich das Bild einfach strecken, wenn sich die Größe ändert. Einen anderen Weg kenne ich nicht. Dazu würde ich einen ComponentListener registrieren, der hat die Methode componentResized. Das ganze sähe dann wohl so aus:

Java:
private Icon defaultIcon;

public void componentResized(ComponentEvent e)
{
	Icon currentIcon = getIcon();
	if(currentIcon == null)
		return;
	if(defaultIcon == null)
		defaultIcon = currentIcon;
	
	int width = getWidth();
	int height = getHeight();

	BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
	g.drawImage(((ImageIcon)defaultImage).getImage(), 0, 0, width, height, null);
	g.dispose();

	setIcon(new ImageIcon(newImage));
}

Ist nur vom Hirn in die Tasten, denke aber dass es klappen sollte. Vorsicht, der Code blockiert den EDT.
 
Du kannst auch einfach die Klasse BackgroundPanel benutzen, die macht zusätzlich alle Komponenten durchsichtig, die ihm hinzugefügt werden (wir wollen ja nicht, dass etwa ein undurchsichtiges Panel das tolle Bild versteckt 🙂 ). Die Klasse BackgroundPanel findest du hier: Background Panel Java Tips Weblog

Gruß,
André
 
ähm ich habe noch ein Problem:

ich wollte gerade mal ausprobieren wie man eine .jar Datei erstellt.
Das hat auch halbwegs funktioniert; das heißt alle Button und so sind da.
Nur der Hintergrund ist weg ;(

Habe ihn bis jetzt so geladen, da er ja direkt im Projekt Ordner lag:
Java:
ImageIcon backgroundImage = new ImageIcon("sterne.jpg");

doch in der .jar ist das Bild nicht mehr vorhanden.
Wie muss ich denn da den Pfad wo das Bild liegt angeben, sodass es auch mit in der jar ist?

Danke
 
Das ist ein relativer Pfad.
Ich habe hier zwar nicht Eclipse, aber ich würde sagen im src Ordner. Dort kannst du sicher auch ein package anlegen, etwa demo. Dieses package (=Unterverzeichnis von scr) sollte dann dein Bild und den Quellcode deiner Klasse (z.B. HauptmenueHintergrund.java) enthalten:
Java:
package demo;
...
public class HauptmenueHintergrund extends JFrame
...

Gruß,
André
 
ähm und wie kommt damit jetzt das Bild auf dem Icon?

Code:
getClass().getResource("/demo/sterne.jpg")

ist ja eine URL

habe das so versucht,
Java:
package pics;

import javax.imageio.ImageIO;
import javax.swing.*;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;

public class Hintergrund 
{
	public static ImageIcon backgroundImage;
	@SuppressWarnings("deprecation")
	public Hintergrund()
	{
		JFrame frame = new JFrame();
        frame.setSize(300, 100);
        
        URL backgroundImageURL = this.getClass().getResource("/pics/was-sind-sterne.jpg");
        
		try 
		{
			backgroundImage = ImageIO.read(backgroundImageURL);
//habe ich im internet gefunden, funktioniert aber nicht
		} 
		catch (IOException e) 
		{
			e.printStackTrace();
		}
        JLabel contentPane = new JLabel();
        contentPane.setIcon(backgroundImage);
        contentPane.setLayout(new BorderLayout());
        frame.setContentPane(contentPane);
        frame.setLocation(0,0);
        frame.resize(Toolkit.getDefaultToolkit().getScreenSize());
        frame.setUndecorated(true);
        frame.setVisible(true);
	}
	public static void main(final String args[]) 
	{
        @SuppressWarnings("unused")
		Runnable gui = new Runnable() 
        {
            public void run() 
            {
                Hintergrund hgrund = new Hintergrund();
            }
        };
	}
}
gibts da noch ne andere Möglichkeit?

Danke
 
Java:
package pics;

import javax.swing.*;
import java.awt.*;

public class Hintergrund
{
    private static ImageIcon backgroundImage;
    
    public Hintergrund()
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        backgroundImage = new ImageIcon(getClass().getResource("/pics/was-sind-sterne.jpg"));
        JLabel contentPane = new JLabel(backgroundImage);
        contentPane.setLayout(new BorderLayout());
        frame.setContentPane(contentPane);
        frame.setLocation(0,0);
        frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());
        frame.setUndecorated(true);
        frame.setVisible(true);
    }
    public static void main(final String args[])
    {
        Runnable gui = new Runnable()
        {
            public void run()
            {
                Hintergrund hgrund = new Hintergrund();
            }
        };
        SwingUtilities.invokeLater(gui);
    }
}
 

Zurück
Oben