# Hintergrundbild im JPanel



## terryl (3. Dez 2008)

Ist wahrscheinlich schon tausendmal gefragt worden, aber entweder bin ich mit dem Code nicht zurechtgekommen oder es funktionierte nicht. Im Forum hab ich mal den Tipp gefunden, dem Panel ein Label hinzuzufügen, deshalb hier ein Code-Auszug:


```
public class MyApp
extends JFrame
{
    /* ... */
	JPanel mypanel = new JPanel( new BorderLayout() );
    mypanel.setOpaque( false );
    JLabel bgimage = new JLabel( new ImageIcon( "img/bg.png" ) );
    mypanel.add( bgimage );
	/* ... */
}
```

So funktioniert's aber nicht unter JDK 1.5. Gibt'S da keine fertige Anweisung in der Art "mypanel.setBackgroundImage(<bild>)"?

Wie bekomme ich es auf einfachste Weise hin, wobei hinzukommt, dass das Bild auswechselbar sein muss zur Laufzeit?

Wäre prima, jemand könnte meinen Beispielcode ergänzen.


----------



## L-ectron-X (3. Dez 2008)

Das könnte gehen, wenn du dir dazu eine eigene Klasse schreibst:


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

public class PicturePanel extends JPanel { 
   private Image image; 

   public PicturePanel() { 
      super(); 
   } 

   public PicturePanel(boolean isDoubleBuffered) { 
      super(isDoubleBuffered); 
   } 

   public PicturePanel(LayoutManager layout) { 
      super(layout); 
   } 

   public PicturePanel(LayoutManager layout, boolean isDoubleBuffered) { 
      super(layout, isDoubleBuffered); 
   } 

   public void setBackgroundImage(Image image) { 
      this.image = image; 
      repaint(); 
   } 

   protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      if(image != null) { 
         g.drawImage(image, 0, 0, this); 
      } 
   } 
}
```

Du instanziierst dann nicht mehr ein JPanel sondern ein Objekt der Klasse PicturePanel und kannst dann aber jederzeit dein Hintergrundbild einsetzen: panel.setBackgroundImage(image);


----------



## terryl (3. Dez 2008)

Wenn ich das richtig verstehe, müsste nach Schreiben der Klasse mein Beispielcode wie folgt aussehen:


```
public class MyApp
extends JFrame
{
    /* ... */
   JPanel mypanel = new PicturePanel( new BorderLayout() );
    mypanel.setBackgroundImage( "bg.jpg" );
   /* ... */
}
```


----------



## L-ectron-X (3. Dez 2008)

Funktioniert's so?


----------



## terryl (3. Dez 2008)

Äh, nein. In der Klasse PicturePanel ist die Methode von dir so definiert worden:


```
public void setBackgroundImage(Image image) {
      this.image = image;
      repaint();
   }
```

Mein Versuch, einen String als Parameter zu übergeben, scheiterte natürlich. Wie muss die Methode aussehen für einen String als Parameter, oder wie muss der Aufruf gecastet werden? ("mypanel.setBackgroundImage( (Image)"bg.jpg" );" funktioniert auch nicht.)


----------



## terryl (3. Dez 2008)

Leider gibt es keine fertige Methode zum Konvertieren eines Strings in ein Objekt vom Typ Image, aber mit dem folgenden Konstrukt geht es (Hurra!):


```
public void setBackgroundImage(String image) {
      Image img = Toolkit.getDefaultToolkit().getImage( image );
      this.image = img;
      repaint();
   }
```

Danke L-ectron-X für deine Hilfe! Verwundert bin ich nur, dass es diese Methode nicht schon fertig in Java gibt. Ich bin doch nicht der einzige, der so etwas machen möchte ...

Jetzt fehlt nur noch eine Ergänzung, die das Bild auf die Größe des Panel vergrößert. Eine Idee?


----------



## terryl (3. Dez 2008)

Oh Mann, wenn man mit dem Kopf ständig auf die Tischplatte schlägt, weil nicht alles gleich so geht wie gedacht, vergisst man so manches (vielleicht wären Schläge auf den Hinterkopf besser ;-):

In meinem Panel wurde ein JLabel und ein weiteres Panel mit FlowLayout eingefügt. Das Bild reichte nicht ins FlowLayout, weil ich vergessen hatte, setOpaque() zu setzen:


```
JPanel buttons = new JPanel( new FlowLayout( FlowLayout.CENTER, 20, 20 ) );
        buttons.setOpaque( false );
```

Schwupp, wurde das Bild im ganzen höheren Panel angezeigt ...

@L-ectron-X: Dein Spruch "Programmieren lernt man nur durch programmieren" bewahrheitet sich mal wieder.


----------



## L-ectron-X (4. Dez 2008)

Hehe...

Achso: Toolkit ist zwar ne schöne Sache, aber zum Bilder einlesen würde ich die Klasse _java.imageio.ImageIO_ und die read()-Methode daraus benutzen. Ist aktueller und performanter.

Lies mal hier, wie man es machen kann: Grafikdateien laden und anzeigen ? Byte-Welt Wiki


----------

