Swing Hintergrundbild auf einem JFrame

Jamarilo

Mitglied
Hallo ich hoffe ihr könnt mir helfen, ich weiss dieses Thema wurde sicher schon 100 mal, aufgegriffen habe mich auch stundenlang durch die verschiedenen Foren gekämpf aber ich komme in meinem Programm einfach nicht auf die Lösung. :autsch:

Ich habe eine JFrame mit 3 JButtons und dahinter möchte ich ein Hintergrundbild einbauen.
Ich zeige euch was ich bis jetzt habe, aber hier ist absolut kein ansatz von einem Hintergrundbild ich habe mein Source Code eifach wieder zum ursprung zurückgestellt da ich schon viel zu viel ausprobiert habe und einfach die übersicher verloren habe.
:bahnhof:

Ich hoffe jemand kann mir helfen.

Java:
import java.awt.Color;
import java.awt.Container;


import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;


public class MainFrame{
	//Main Frame
	private JFrame mainFrame;
	
	//Container um die Hintergrundfarbe zu ändern
	private Container contentPane;
	
	//Deklariere Buttons
	private JButton neu;
	private JButton abfragen;
	private JButton export;
	
	//Deklariere Icons
	private Icon neu1;
	private Icon abfragen1;
	private Icon export1;
	
	//Deklariere Menüleiste
	private JMenuBar menüLeiste;
	
	//Deklariere Menü
	private JMenu dateiMenü;
	private JMenu spracheMenü;
	private JMenu hilfeMenü;
	
	//Deklariere Menüeinträge
	private JMenuItem neuEintrag;
	private JMenuItem öffneEintrag;
	private JMenuItem speichernEintrag;
	private JMenuItem statistikEintrag;
	private JMenuItem beendenEintrag;
	
	private JMenuItem deutschEintrag;
	private JMenuItem italienischEintrag;
	private JMenuItem französischEintrag;
	private JMenuItem englischEintrag;
	
	private JMenuItem infoEintrag;
	private JMenuItem anleitungEintrag;
	private JMenuItem überunsEintrag;
	

	//Initialisiert das Fenster
	public MainFrame(){
		
		mainFrame = new JFrame("Vokabel Trainer");
		
		contentPane = mainFrame.getContentPane();
		
		//Bilder werden generiert
		neu1 = new ImageIcon("Icon/new.png");
		abfragen1 = new ImageIcon("Icon/abfrage.png");
		export1 = new ImageIcon("Icon/export.png");
		
		//Bilder werden zu den Buttons zugewiesen und generiert
		neu = new JButton(neu1);
		abfragen = new JButton(abfragen1);
		export = new JButton(export1);
		
		//Menüleiste wird generiert
		menüLeiste = new JMenuBar();
		
		//Menü wird generiert
		dateiMenü = new JMenu("Datei");
		spracheMenü = new JMenu("Sprachen");
		hilfeMenü = new JMenu("Hilfe ?");
		
		//Menüeinträge werden generiert
		neuEintrag = new JMenuItem("Neu");
		öffneEintrag = new JMenuItem("Öffnen ...");
		speichernEintrag = new JMenuItem("Speichern");
		statistikEintrag = new JMenuItem("Statistik");
		beendenEintrag = new JMenuItem("Beenden");
		
		deutschEintrag = new JMenuItem("Detusch");
		italienischEintrag = new JMenuItem("Italienisch");
		französischEintrag = new JMenuItem("Französisch");
		englischEintrag = new JMenuItem("Englisch");
		
		infoEintrag = new JMenuItem("Info");
		anleitungEintrag = new JMenuItem("Anleitung");
		überunsEintrag = new JMenuItem("über uns");
	}

		
	/**
	 * Das Main Frame des Vokabel Trainers wird gezeichnet
	 */
	public void guiInitialisation(){
		
		//Hauptfenster wird initaliesiert
		mainFrame.setLayout(null);
		mainFrame.setSize(1200, 700);
		mainFrame.setResizable(false);
		mainFrame.setVisible(true);
		mainFrame.setLocationRelativeTo(null);
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//Containerfarbe wird geändert
		contentPane.setBackground(Color.darkGray);

		
		//Menüleiste wird in das Hauptfenster gebaut
		mainFrame.setJMenuBar(menüLeiste);
		
		//Knöpfe werden positioniert
		neu.setBounds(136, 233, 128, 128);
		neu.setBackground(Color.darkGray);
		neu.setBorder(BorderFactory.createEmptyBorder());
		
		abfragen.setBounds(536, 233, 128, 128);
		abfragen.setBackground(Color.darkGray);
		abfragen.setBorder(BorderFactory.createEmptyBorder());
		
		export.setBounds(936, 233, 128, 128);
		export.setBackground(Color.darkGray);
		export.setBorder(BorderFactory.createEmptyBorder());
				
		//Menüleinträge werden ins Mainframe gepackt
		menüLeiste.add(dateiMenü);
		menüLeiste.add(spracheMenü);
		menüLeiste.add(hilfeMenü);
		
		//Menüinhalte werden in die Menüs gepackt
		dateiMenü.add(neuEintrag);
		dateiMenü.add(öffneEintrag);
		dateiMenü.add(speichernEintrag);
		dateiMenü.add(statistikEintrag);
		dateiMenü.add(beendenEintrag);
		
		spracheMenü.add(deutschEintrag);
		spracheMenü.add(italienischEintrag);
		spracheMenü.add(französischEintrag);
		spracheMenü.add(englischEintrag);
		
		hilfeMenü.add(infoEintrag);
		hilfeMenü.add(anleitungEintrag);
		hilfeMenü.add(überunsEintrag);
		
				
		//Knöpfe werden auf den Container gelegt
		contentPane.add(neu);
		contentPane.add(abfragen);
		contentPane.add(export);
		
		//Container wird auf das Hauptfenster gelegt
		mainFrame.add(contentPane);
	}
	
	
	/**
	 * Main Methode um die Aplikation zu starten
	 */
	public static void main(String[] args){
		
		MainFrame gui = new MainFrame();
		gui.guiInitialisation();
	}
}
 
Generell erstellt man ein JPanel und überschreibt dort paintComponent
Java:
		JPanel contentPane = new JPanel() {
			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
			}
		};
		contentPane.setLayout(null);
//......
		mainFrame.setContentPane(contentPane);

- null-Layout ist böse und evtl. auch einer der Gründe wieso du hier so Probleme hattest
- setVisible am Besten immer zum Schluss aufrufen !
 
Hmm, ok im eigentlichen läuft das GUI so aber du meinst es ist besser wen ich auf JFrame noch ein JPanel lege und die Paint methode vom JPanel überschreibe um die Hintergrundfarbe zu ändern...??

Was ist wen ich ein richtiges Hintergrundbild.jpg verwenden möchte wie überschreibe ich dann die Paint methode und wie setze ich dort noch ein .jpg bild ein...?

Ich weiss ich hab viele fragen aber ich Danke dir...
 
Hä? Also nochmal von vorne und erkläre mal genau was du machen willst oder besser gesagt was du nicht verstehst. In deinem geposteten Code, kannst du Zeile 161 löschen, die ist unsinnig und zudem auch falsch --> Exception!
Da sollte doch die Hintergrundfarbe auch gesetzt sein dann oder nicht?
Und wie man einr ichtiges Bild einsetzt, schrieb ich doch oben.
Du musst vorher in Image laden (ImageIO.read(..) oder wie auch immer ) und dann einfach mit drawImage malen, so wie oben beschrieben! :autsch::rtfm:
 
ok, code zeile 161 kann ich löschen das stimmt und die Hintergrundfarbe habe ich auch bereits.

Also du must wissen ich habe gerade erst angefangen zu lernen wie man GUIs implementiert, ja ok du hast es mir geschribe nur ich verstehe es leider nicht ganz wie lade ich ein Image?

Und falls ich das mal schafe muss ich nur noch die methode drawImage aufrufen.
Jetzt nur noch zum Verständnis, ich lege auf das JFrame ein JPanel und im JPanel wird das Hintergrundbild gespeichert....

Sorry bin noch zimlich neu in der Welt des Programmierens..
 
Also sorry aber wie man Bilder lädt steht sicherlich in einem java-Buch oder auch tausendfach im Internet!
z.B. hier: Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 17.6 Bilder

Da ich aber das Gefühl habe dass wir so nicht weiter kommen, habe ich mal deinen Code etwas angepasst:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class MainFrame {
	// Main Frame
	private JFrame mainFrame;

	// Deklariere Buttons
	private JButton neu;
	private JButton abfragen;
	private JButton export;

	// Deklariere Icons
	private Icon neu1;
	private Icon abfragen1;
	private Icon export1;

	// Deklariere Menüleiste
	private JMenuBar menüLeiste;

	// Deklariere Menü
	private JMenu dateiMenü;
	private JMenu spracheMenü;
	private JMenu hilfeMenü;

	// Deklariere Menüeinträge
	private JMenuItem neuEintrag;
	private JMenuItem öffneEintrag;
	private JMenuItem speichernEintrag;
	private JMenuItem statistikEintrag;
	private JMenuItem beendenEintrag;

	private JMenuItem deutschEintrag;
	private JMenuItem italienischEintrag;
	private JMenuItem französischEintrag;
	private JMenuItem englischEintrag;

	private JMenuItem infoEintrag;
	private JMenuItem anleitungEintrag;
	private JMenuItem überunsEintrag;

	private BufferedImage img;

	// Initialisiert das Fenster
	public MainFrame() {

		mainFrame = new JFrame("Vokabel Trainer");

		// Bilder werden generiert
		neu1 = new ImageIcon("Icon/new.png");
		abfragen1 = new ImageIcon("Icon/abfrage.png");
		export1 = new ImageIcon("Icon/export.png");

		// Bilder werden zu den Buttons zugewiesen und generiert
		neu = new JButton(neu1);
		abfragen = new JButton(abfragen1);
		export = new JButton(export1);

		// Menüleiste wird generiert
		menüLeiste = new JMenuBar();

		// Menü wird generiert
		dateiMenü = new JMenu("Datei");
		spracheMenü = new JMenu("Sprachen");
		hilfeMenü = new JMenu("Hilfe ?");

		// Menüeinträge werden generiert
		neuEintrag = new JMenuItem("Neu");
		öffneEintrag = new JMenuItem("Öffnen ...");
		speichernEintrag = new JMenuItem("Speichern");
		statistikEintrag = new JMenuItem("Statistik");
		beendenEintrag = new JMenuItem("Beenden");

		deutschEintrag = new JMenuItem("Detusch");
		italienischEintrag = new JMenuItem("Italienisch");
		französischEintrag = new JMenuItem("Französisch");
		englischEintrag = new JMenuItem("Englisch");

		infoEintrag = new JMenuItem("Info");
		anleitungEintrag = new JMenuItem("Anleitung");
		überunsEintrag = new JMenuItem("über uns");
	}

	/**
	 * Das Main Frame des Vokabel Trainers wird gezeichnet
	 */
	public void guiInitialisation() {
		mainFrame.setSize(1200, 700);
		mainFrame.setResizable(false);
		mainFrame.setLocationRelativeTo(null);
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		initImage();
		JPanel contentPane = new JPanel() {
			@Override
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				if (img != null) {
					g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
				}
			}
		};
		contentPane.setLayout(null);
		// Menüleiste wird in das Hauptfenster gebaut
		mainFrame.setJMenuBar(menüLeiste);

		// Knöpfe werden positioniert
		neu.setBounds(136, 233, 128, 128);
		neu.setBackground(Color.darkGray);
		neu.setBorder(BorderFactory.createEmptyBorder());

		abfragen.setBounds(536, 233, 128, 128);
		abfragen.setBackground(Color.darkGray);
		abfragen.setBorder(BorderFactory.createEmptyBorder());

		export.setBounds(936, 233, 128, 128);
		export.setBackground(Color.darkGray);
		export.setBorder(BorderFactory.createEmptyBorder());

		// Menüleinträge werden ins Mainframe gepackt
		menüLeiste.add(dateiMenü);
		menüLeiste.add(spracheMenü);
		menüLeiste.add(hilfeMenü);

		// Menüinhalte werden in die Menüs gepackt
		dateiMenü.add(neuEintrag);
		dateiMenü.add(öffneEintrag);
		dateiMenü.add(speichernEintrag);
		dateiMenü.add(statistikEintrag);
		dateiMenü.add(beendenEintrag);

		spracheMenü.add(deutschEintrag);
		spracheMenü.add(italienischEintrag);
		spracheMenü.add(französischEintrag);
		spracheMenü.add(englischEintrag);

		hilfeMenü.add(infoEintrag);
		hilfeMenü.add(anleitungEintrag);
		hilfeMenü.add(überunsEintrag);

		// Knöpfe werden auf den Container gelegt
		contentPane.add(neu);
		contentPane.add(abfragen);
		contentPane.add(export);

		// Container wird auf das Hauptfenster gelegt
		mainFrame.setContentPane(contentPane);
		mainFrame.setVisible(true);
	}

	private void initImage() {
		try {
			img = ImageIO
					.read(new URL(
							"http://www.lonelyplanet.com/maps/asia/indonesia/java/map_of_java.jpg"));
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Main Methode um die Aplikation zu starten
	 */
	public static void main(String[] args) {

		MainFrame gui = new MainFrame();
		gui.guiInitialisation();
	}
}

lese den o.g. Link, und passe dann ggf. die Methode initImage() an...
 

Neue Themen


Zurück
Oben