# Bilder in Java



## marioschluse (29. Jan 2013)

Hallo Leute, was ist die effizienteste Methode 
Bilder in Java anzuzeigen und zu ändern?

Ich gehe momentan wie folgt vor:
- Hole Pfad des Bilds
- Erzeuge BufferedImage und lese das Bild ein
- Erzeuge aus dem BufferedImage ein Icon
- Erzeuge ein Label mit dem Icon

Das Problem ist jetzt: Ich hab ein Componentlistener eingebaut, dadurch ändere ich die Größe
des Bilds, wenn ich die Größe des Panel, in dem das Label drinne ist, verändert wird.

Leider muss ich dann jedesmal ein neues Icon erzeugen usw. und das dauert zu lange....

Hat jemand einen bessere Idee?

Danke


----------



## Marco13 (29. Jan 2013)

Kommt da irgendwo ein getScaledInstance vor? 

Je nachdem, worum es geht, könnte es sinnvoll sein, sich einfach eine ImageComponent zu basteln, d.h. eine Klasse die von JPanel erbt, im Konstruktor das originalbild übergeben bekommt, und es in paintComponent nur mit
g.drawImage(image,0,0,getWidth(),getHeight(),this);
in der passenden Größe zeichnet.


----------



## André Uhres (29. Jan 2013)

Wie Marco13 schon andeutete, paintComponent überschreiben und dort das Bild so malen:

```
Dimension d = getSize();
g.drawImage(image, 0, 0, d.width, d.height, null);
```
Dann wird das Bild skaliert auf Panelgröße. Hier findest Du ein Beispiel: Background Panel  Java Tips Weblog

Gruß,
André


----------



## marioschluse (29. Jan 2013)

Danke für die Antworten.

Hm... mit dem Beispiel kann ich leider nicht viel Anfangen.
Das Beispiel geht ja nicht so vor, wie Marco13 beschrieben hat...
Hast du vielleicht ein anderes Beispiel, das so vorgeht wie Marco beschrieben hat?


----------



## André Uhres (29. Jan 2013)

Im Beispiel findest Du die Methode paintComponent. Dort steht u.A. dieser Code:

```
switch (style)
		{
			case SCALED :
				drawScaled(g);
				break;

			case TILED  :
				drawTiled(g);
				break;

			case ACTUAL :
				drawActual(g);
				break;

			default:
            	drawScaled(g);
		}
```
Im Fall von SCALED wird drawScaled aufgerufen, wo das Bild so gemalt wird, wie beschrieben.

Gruß,
André


----------



## marioschluse (29. Jan 2013)

Hi,

Die methode "drawScaled" erwartet Graphic g als Parameter...
Was soll das sein???
Und dann noch dieser komischer Konstruktor mit rekursion...

Ich blick in dem Beispiel Code leider nicht durch...

Kann mir jemand vlt ein minimalistisches Beispiel zeigen?

Dafür wäre ich sehr dankbar...


----------



## André Uhres (30. Jan 2013)

marioschluse hat gesagt.:


> Die methode "drawScaled" erwartet Graphic g als Parameter...
> Was soll das sein???



Das ist der Parameter von paintComponent und wird hier erklärt: Malen in Swing Teil 1: der grundlegende Mechanismus



marioschluse hat gesagt.:


> Und dann noch dieser komischer Konstruktor mit rekursion...



Mitunter werden zwar verschiedene Konstruktoren angeboten, aber nur in einem Konstruktor verbirgt sich die tatsächliche Initialisierung des Objekts. Java lässt deshalb eine Konstruktor-Verkettung mit dem Schlüsselwort this zu. Siehe auch: Galileo Computing :: Java ist auch eine Insel – 6.5.5 Einen anderen Konstruktor der gleichen Klasse aufrufen



marioschluse hat gesagt.:


> Ich blick in dem Beispiel Code leider nicht durch...
> Kann mir jemand vlt ein minimalistisches Beispiel zeigen?



Kein Problem:


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

/*
 *  Support custom painting on a panel in the form of
 *  images that can be scaled
 */
public class BackgroundPanel extends JPanel {

    private Image image;

    /*
     *	Set the image used as the background
     */
    public void setImage(Image image) {
        this.image = image;
        repaint();
    }

    /*
     *  Provide a preferred size equal to the image size
     */
    @Override
    public Dimension getPreferredSize() {
        if (image == null) {
            return super.getPreferredSize();
        } else {
            return new Dimension(image.getWidth(null), image.getHeight(null));
        }
    }

    /*
     *  Add custom painting
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        //  Draw the image

        if (image == null) {
            return;
        }

        /*
         *  Custom painting code for drawing a SCALED image as the background
         */
        Dimension d = getSize();
        g.drawImage(image, 0, 0, d.width, d.height, null);
    }
}
```

Gruß,
André


----------



## marioschluse (1. Feb 2013)

Vielen Dank, 
dein Beispiel Code hat mir sehr geholfen ^^


----------

