# Bild als Hintergrund



## joschika77 (26. Feb 2004)

Hallo!

Wie bekomme ich ein Bild in den Hintergrund des Applets?

Versucht habe ich es so:


```
ImageIcon ImBu = new ImageIcon(getClass().getResource("test.bmp"));;

                    public void paint(Graphics g)
	{
		super.paint(g);
		Insets insets = getInsets();
		ImBu.paintIcon(this,g, insets.left, insets.top);

		g.setColor(Color.red);                         
		g.drawString("Hallo Java-Freaks!",150,125);
	}
```

MfG Ronn


----------



## Stefan1200 (26. Feb 2004)

Theoretisch müsste es mit g.drawImage() klappen. Allerdings müssen danach Komponenten repainted werden.


----------



## biker126 (26. Feb 2004)

und ich würd dir empfehlen einen mediatracker einzubauen. denn auch bei relativ kleinen bildern (paar kb) dauerts übers internet (ja, auch mit superduper dsl) meist zu lange bis das bild geladen ist. und dann wirds nur zu hälfte angezeigt usw. (gibt einfach unschöne effekte). 
deshalb mit nem mediatracker warten bis das pic geladen ist und dann erst zeichnen...


----------



## Stefan1200 (27. Feb 2004)

biker126 hat gesagt.:
			
		

> und ich würd dir empfehlen einen mediatracker einzubauen. denn auch bei relativ kleinen bildern (paar kb) dauerts übers internet (ja, auch mit superduper dsl) meist zu lange bis das bild geladen ist.



Er verwendet im obigen Source doch ImageIcon, das ist doch in Ordnung.
Und jeder der die API liest (;-)), weiss ja, das ImageIcon die Bilder mit dem MediaTracker lädt, damit diese vollständig sind.


----------



## Beni (27. Feb 2004)

Du zeichnest zuerst alle Components, und danach zeichnest Du das Bild _über _den Components.
 :arrow: Reihenfolge umkehren.


----------



## joschika77 (27. Feb 2004)

Wie meinst du das?
Hab es auch schon mit Image probiert.
Das geht genauso wenig.

Gruß Ronn


----------



## Stefan1200 (27. Feb 2004)

Du lädst zum Beispiel ein Bild mit ImageIcon.
In der paint Methode rufst du g.drawImage() mit den entsprechenden Parametern auf (Das Bild bekommst du mit imageIcon.getImage()), die X,Y Größen bekommst du ja von deinem Frame.
Buttons und andere Componenten müssen nach g.drawImage() mit repaint() neugezeichnet werden, z.B. jbutton.repaint().

Das ist jetzt grob erklärt, bei mir funktioniert es, auch wenn es bei einer ComboBox nicht funktioniert, und Radio Buttons blöd aussehen wegen dem grau ;-).


----------



## joschika77 (27. Feb 2004)

g.drawImage geht nur bei Image.
So ist es jetzt.


```
ImageIcon bild = new ImageIcon(getClass().getResource("bild.bmp"));; 

	public void paint(Graphics g) 
	{ 
		super.paint(g);
   
                                        // so sieht man nichts
		bild.paintIcon(this,g, 10, 10);
		
                                        //so geht es gar nicht
		g.drawImage(bild,10,10,this);
	
		
	}
```

Gruß Ronn


----------



## Stefan1200 (27. Feb 2004)

Ronnules hat gesagt.:
			
		

> g.drawImage geht nur bei Image.



Das ist zwar richtig, aber jetzt sage mir bitte, warum ich dir geschrieben habe, das du beim ImageIcon getImage() anwenden sollst, um ein Image Object zu erhalten ;-).
Aber es gibt viele Möglichkeiten, um zum Ziel zu kommen.


----------



## Beni (27. Feb 2004)

Stefan1200 hat gesagt.:
			
		

> Buttons und andere Componenten müssen nach g.drawImage() mit repaint() neugezeichnet



*NEIN !!!*
1. Beiträge lesen die andere schreiben (grummel grummel)
2. Diese Methode funktioniert zwar, aber es ist die Umständlichste aller Möglichkeiten

Ein Beispiel mit AWT-Applet






```
package testing;

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

public class AppletTest extends Applet {
  private ImageIcon image;

  public AppletTest() {
  }

  public void init(){
    Button button = new Button( "hello" );
    setLayout( null );
    add( button );
    button.setBounds( 10, 10, 50, 50 );

    image = createImage();
  }

  private static ImageIcon createImage(){
    BufferedImage img = new BufferedImage( 100, 100, BufferedImage.TYPE_INT_RGB );

    Graphics g = img.createGraphics();

    g.setColor( Color.white );
    g.fillRect( 0, 0, 100, 100 );
    g.setColor( Color.blue );
    g.fillOval( 0, 0, 100, 100 );

    g.dispose();

    return new ImageIcon( img );
  }

  public void paint( Graphics g ){
    image.paintIcon( this, g, 0, 0 );
    super.paintComponents( g );
  }
}
```

@Ronnules
Überprüf doch mal, ob das Bild überhaupt angekommen ist.


----------



## joschika77 (27. Feb 2004)

Ok,ok!
So hab ichs jetzt gemacht.Das Bild wird einfach nicht sichtbar.


```
public class App extends Applet
{
	ImageIcon bild = new ImageIcon(getClass().getResource("faust.bmp"));
	
	public void paint(Graphics g) 
	{ 
		super.paint(g);
		setSize(450,200);
   		g.setColor(Color.red);                          
   		g.drawString("Hallo Java-Freaks!",150,125); 

		g.drawImage(bild.getImage(),10,10,this);
		
	}  
}
```


----------



## Stefan1200 (27. Feb 2004)

@ Beni:

Naja, ich habe ja nur die Variante mitteilen wollen, die ich kenne.
Ob meine Variante gut ist, wollte ich damit nicht ausdrücken, aber anders kannte ich das nicht.

Funktioniert deine Variante eigentlich auch bei Swing einwandfrei?


----------



## Beni (27. Feb 2004)

@Ronnules
Hm, vielleicht hab ich jetzt was überlesen, und stelle deshalb meine Fragen doppelt:
Kannst Du sicher sein, dass das Bild existiert und geladen wird?

@Stefan
Mit ein paar Änderungen:


```
package testing;

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

public class AppletTest extends JApplet {
  private ImageIcon image;

  public AppletTest() {
  }

  public void init(){
    JPanel panel = new JPanel( null ){
      public void paintComponent( Graphics g ){
        image.paintIcon( this, g, 0, 0 );
      }
    };

    Button button = new Button( "hello" );
    panel.add( button );
    getContentPane().add( panel );
    button.setBounds( 10, 10, 50, 50 );

    image = createImage();
  }

  private static ImageIcon createImage(){
    BufferedImage img = new BufferedImage( 100, 100, BufferedImage.TYPE_INT_RGB );

    Graphics g = img.createGraphics();

    g.setColor( Color.white );
    g.fillRect( 0, 0, 100, 100 );
    g.setColor( Color.blue );
    g.fillOval( 0, 0, 100, 100 );

    g.dispose();

    return new ImageIcon( img );
  }
}
```

mfg Beni


----------



## joschika77 (27. Feb 2004)

Nein kann ich nicht.
Habe mit System.out.println(bild);
den Pfad.Der stimmt.Nun weiß ich nich ob er das Bild lädt.
Wie kann ich das überprüfen?
Gruß Ronn


----------



## Beni (27. Feb 2004)

*Einfach:* Höhe und Breite überprüfen, wenn die 0 sind...
*Komplizierter: *getImageLoadStatus()  (sollte = MediaTracker.COMPLETE sein)
*Aufwendig:* Das Bild durch ein anderes ersetzen, welches sicher geladen wird (so was, wie dieses "createImage", welches im Code oben steht).

mfg Beni


----------



## joschika77 (27. Feb 2004)

Habe jetzt System.out.println(bild.getImageLoadStatus()); mal probiert.
ER gibt 4 und dann nochmal 4 aus.
Hä????

Gruß Ronn


----------



## Beni (27. Feb 2004)

> java.awt.MediaTracker
> public static final int 	ABORTED 	=2;
> public static final int 	COMPLETE 	=8;
> public static final int 	ERRORED 	=4;
> public static final int 	LOADING 	=1;



Frage: *bmp*, wird dieses Format überhaupt verarbeitet? (würde mal auf nein tippen).
Versuchs doch mal mit einem gif, jpg oder png-Bild


----------



## joschika77 (27. Feb 2004)

Jo Danke.
Hab den Fehler!
Der kam mit *.bmb nicht klar.
Habs in *.gif umgewandelt und siehe da.
So ein Scheiß.Und ich suche und suche.

Ok Danke nochmal.

MfG Ronn


----------



## ugh_bough (10. Mrz 2004)

weiß jemand wie das mit einem jwindow geht?
wie kann ich denn ein hintergrundbild in ein jwindow zeichnen?

dank


----------



## ugh_bough (10. Mrz 2004)

hat sich erledigt. für alle, die es wissen wollen

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

public class StartUpWindow extends JWindow {
    
    Image image;
    
    public StartUpWindow() {
        ImageIcon icon = new ImageIcon("images/kyle.jpg");
        image = icon.getImage();
        
        this.setSize(icon.getIconWidth(), icon.getIconHeight());
        
        this.setVisible(true);
    }

    public static void main(String[] args) {
        StartUpWindow suw = new StartUpWindow();
    }
    
    public void paint(Graphics g) {
        g.drawImage(image, 0, 0, this);
    }
}
```

location auf dem bildschirm ist noch nicht eingestellt


----------



## Beni (10. Mrz 2004)

Wenn du noch Knöpfe etc. haben willst: Nimm ein JPanel, überschreib paintComponent( Graphics g ), und füge die Buttons danach diesem JPanel zu.

mfg Beni


----------



## ugh_bough (10. Mrz 2004)

paintComponent wird dann aber genauso überschrieben wie die paint methode oben? oder? muss dann auch noch der aufruf zum zeichnen der innenliegenden komponenten von hand gemacht werden?


----------



## Beni (10. Mrz 2004)

Bei den JComponents ist es so: die paint-Methode ruft zuerst "paintComponent", danach "paintChildren" auf.
Du musst nichts weiter aufrufen (ausser _drawImage_).


----------



## ugh_bough (10. Mrz 2004)

aber man kann doch auch einfach bei dem window einen layoutmanager einstellen und so neue komponenten einfügen


----------



## Beni (10. Mrz 2004)

Aber zwischen einem JWindow und den Buttons liegen noch ein RootPane und ein ContentPane.
Unter Umständen siehst du nur grau.

Auch ist die Methode mit einem JPanel praktischer: wenn Du mal ein Frame anstelle eines Windows verwenden willst, oder das Bild nur einen Teil füllen soll, ...


----------

