# Hintergrundbild in Jframe einfügen



## yvoloves (29. Apr 2015)

Hallo Liebe Community,

Ich muss im Rahmen eines Projektes für die Schule ein Spiel programmieren.

Nun versuche ich für mein JFrame Form fenster ein hintergrundbild festzulegen, hab auch schon diverse Idden ausprobiert, aber nichts will funktionieren. :bahnhof:

Hat hier einer eine Idee mit welchem einfachen Befehl ich das hinbekommen könnte ?

Danke schonmal im Vorraus


----------



## Enceladus271 (29. Apr 2015)

Du musst in deinem Panel die Methode paintComponent überschreiben. Mit Graphic.drawImage kannst du dann das Image zeichen.


----------



## yvoloves (29. Apr 2015)

Wie zeichnen?

ich will aus einem ordner auf meinem Laufwerk ein bild einfügen , geht des damit auch ?


----------



## Enceladus271 (29. Apr 2015)

Also ein Image Objekt kannst du z.B. so erzeugen:
java.awt.Image image = new javax.swing.ImageIcon( "test.jpg" ).getImage();

Es gibt keinen Konstruktor für JFrame oder JPanel wo du dieses Image dann angeben kannst. D.h. wenn du es z.B. in einem JFrame haben willst, dann musst du deine eigene Klasse von JFrame ableiten.

In JFrame gibt es eine Methode paint(Graphics). Diese Methode wird automatisch von Java aufgerufen wenn das JFrame auf dem Monitor angezeigt werden soll. Diese Methode musst du überschreiben, so dass sie zusätzlich das Bild auf dem JFrame anzeigt ("zeichnet"). Und das kannst du erreichen, indem du bei dem Graphics Objekt, welches der paint Methode als Parameter übergeben wird einfach die Methode drawImage aufrufst.


----------



## yvoloves (30. Apr 2015)

Achso alles klar , ich versuchs am Montag mal 

Danke dir !


----------



## Androbin (30. Apr 2015)

Enceladus271 hat gesagt.:


> Also ein Image Objekt kannst du z.B. so erzeugen:
> java.awt.Image image = new javax.swing.ImageIcon( "test.jpg" ).getImage();
> 
> Es gibt keinen Konstruktor für JFrame oder JPanel wo du dieses Image dann angeben kannst. D.h. wenn du es z.B. in einem JFrame haben willst, dann musst du deine eigene Klasse von JFrame ableiten.
> ...


1. Das Bild holt er sich besser über:

```
BufferedImage image = null;
try { image = ImageIO.read( ResourceLoader.class.getResource( "<Pfad>" ) ); }
catch ( Exception e )  { e.printStackTrace(); }
```

2. Man leitet grundsätzlich nicht von JFrame ab,
da man es ja in seiner Funktion nicht erweitert,
leite stattdessen von JPanel oder noch besser von JComponent
und füge es einem JFrame als ContentPane hinzu.

3. Überschreibe auf gar keinen Fall paint, sondern paintComponent,
da in paint mehr passiert als nur paintComponent aufzurufen ...,
und rufe dort als aller erstes super.paintComponent auf,
da das für DoubleBuffering notwendig ist.


----------



## yvoloves (4. Mai 2015)

Funktioniert irgendwie trotzdem nicht 
ich verzweifle noch


----------



## yvoloves (4. Mai 2015)

im moment sieht mein code so aus : 


```
import com.sun.xml.internal.ws.api.ResourceLoader;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Hauptmenü.java
 *
 * Created on 27.04.2015, 03:10:38
 */

/**
 *
 * @author riesyv
 */
public class Hauptmenü extends javax.swing.JFrame {

    // JFrame-Objekt zum "Merken" des Startformulars
    JFrame start = null;

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */

    BufferedImage image = null;
    
    /** Creates new form Hauptmenü */
    public Hauptmenü() {
        

        try {
            image = ImageIO.read(ResourceLoader.class.getResource("H:/Schule/Jahrgangsstufe 2/WI/Projekt/Bilder/hintergrund.jpeg"));
        }

        
    catch ( IOException e )
    {
        // e.printStackTrace();
    }
        initComponents();
    }

    

    /*   public void Hintergrundbild(java.awt.event.ActionEvent evt){

        try {
            image = ImageIO.read(ResourceLoader.class.getResource("H:/Schule/Jahrgangsstufe 2/WI/Projekt/Bilder/hintergrund.jpeg"));
        }

        
    catch ( IOException e )
    {
        // e.printStackTrace();
    } 
    }*/

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        lblTextWWM = new javax.swing.JLabel();
        btnNeuesSpiel = new javax.swing.JButton();
        btnSpielBeenden = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setForeground(java.awt.Color.white);

        lblTextWWM.setFont(new java.awt.Font("Tahoma", 0, 24)); // NOI18N
        lblTextWWM.setText("Wer wird Millionär ?");

        btnNeuesSpiel.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        btnNeuesSpiel.setText("Neues Spiel");
        btnNeuesSpiel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNeuesSpielActionPerformed(evt);
            }
        });

        btnSpielBeenden.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        btnSpielBeenden.setText("Spiel beenden");
        btnSpielBeenden.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSpielBeendenActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(151, 151, 151)
                .addComponent(lblTextWWM)
                .addContainerGap(186, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(67, 67, 67)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(btnSpielBeenden, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 403, Short.MAX_VALUE)
                    .addComponent(btnNeuesSpiel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 403, Short.MAX_VALUE))
                .addGap(78, 78, 78))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lblTextWWM, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(50, 50, 50)
                .addComponent(btnNeuesSpiel)
                .addGap(61, 61, 61)
                .addComponent(btnSpielBeenden)
                .addContainerGap(74, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void btnSpielBeendenActionPerformed(java.awt.event.ActionEvent evt) {                                                
      System.exit(0);
    }                                               

    private void btnNeuesSpielActionPerformed(java.awt.event.ActionEvent evt) {                                              
        // Startfenster unsichtbar machen
        this.setVisible(false);
        // Fensterobjekt für Formular Kundendaten anlegen
        Spiel spiel = new Spiel();
        // Aktuelles Fensterobjekt (Startfenster) zum "Merken" an das Folge-
        // fenster übergeben - damit kann man das Startfenster beim Beenden
        // des Formulars Spiel wieder sichtbar machen.
        spiel.setHauptmenü(this);
        // Fenster zum Lesen der Kundendaten sichtbar machen
        spiel.setVisible(true);
    }                                             

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                Hauptmenü start = new Hauptmenü();
                new Hauptmenü().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton btnNeuesSpiel;
    private javax.swing.JButton btnSpielBeenden;
    private javax.swing.JLabel lblTextWWM;
    // End of variables declaration                   

}
```


----------



## yvoloves (4. Mai 2015)

habs anderst gelöst ! 
aber danke für die Mühe


----------

