# Paint und Buttons



## Gast (27. Sep 2007)

Hi ist es möglich mit JFrame in der Paint() Bilder usw zu malen und gleichzeitig auf das Fenster Buttons an bestimmte stellen zu setzen, dabei soll aber der Hintergrund noch die Bilder sein.

Meine das in etwa so:

Bild:Landschaft
Bild:Verkäufer
Buttons:Verkäufer

Bitte nicht nur Schlagwörter  vllt habt ihr sogar ein kleines Beispiel.


----------



## Marco13 (27. Sep 2007)

Sinnvollerweise würde man das nicht direkt im Frame machen, sondern in einem Panel (das evtl. dann die einzige Component in diesem Frame ist)


```
class ImagePanel
{
    private BufferedImage image;

    public ImagePanel(BufferedImage image)
    {
        this.image = image;
    }

    public void paintComponent(Graphics g)
    {
        g.drawImage(image, 0,0, this); // Erst das Bild malen
        super.paintComponent(g); // Dann den Rest (Buttons und andere Children)
    }
}
```
Das Panel kann man wie ein normales Panel verwenden, nur dass man ihm beim Erstellen zusätlich ein Bild gibt, das dann gezeichnet wird.


----------



## Gast (27. Sep 2007)

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

public class BvP {

	public static void main(String[] args) {
		
		ImagePanel f= new ImagePanel();
		f.setSize(640, 544);
		JPanel p1 = new JPanel();
		JButton b1 = new JButton();
		//p1.paintComponents(g); g ??
		p1.add(b1);
		f.add(p1);
		f.setVisible(true);
	}
}

class ImagePanel extends JFrame{ 
    Image image=Toolkit.getDefaultToolkit().getImage("grafik/imoy.gif");

    public void paintComponent(Graphics g) 
    { 
        g.drawImage(image, 0,0, this); // Erst das Bild malen 
        super.paintComponents(g); // Dann den Rest (Buttons und andere Children) 
    } 
}
```

Soweit habe ich das...Button zeichnets auch aber denke ich nicht über die paintComponent().
Wo muss ich die aufrufen?


----------



## Gast (27. Sep 2007)

ok pfad zur Bild Datei war falsch....problem...er zeichent ganz schnell das bild und dannach sofort wieder die Buttons und löscht das bild


----------



## Marco13 (27. Sep 2007)

ImagePanel ist (wie der name schon sagt, und wie auch in meinem Code stand) ein Panel, und kein Frame. Aber ... ein "setOpaque" hat nocht gefehlt.

Hier nochmal lauffähig (Bildpfad geändert, bei dir halt anpassen)

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

public class BvP {

   public static void main(String[] args) {

      JFrame f = new JFrame();
      f.setSize(200, 544);
      ImagePanel p= new ImagePanel();
      JPanel p1 = new JPanel();
      JButton b1 = new JButton();
      //p1.paintComponents(g); g ??
      p1.add(b1);
      p.add(p1);
      f.add(p);
      f.setVisible(true);
   }
}

class ImagePanel extends JPanel{
    Image image=Toolkit.getDefaultToolkit().getImage("bildA.gif");

    public ImagePanel()
    {
        setOpaque(false);
    }

    public void paintComponent(Graphics g)
    {
        g.drawImage(image, 0,0, this); // Erst das Bild malen
        super.paintComponent(g); // Dann den Rest (Buttons und andere Children)
    }
}
```


----------



## Guest (27. Sep 2007)

COOOOOOOOL Es funktionier !  1000x dank jetzt kann ich entlich das spiel schreiben  geht sicher mit allem oder? Also auch Labels etc..bzw wie mache ich es dann wieder weg? Weil die Person soll auf einem "rasterfeld" laufen und dazu dürfen dann keine buttons o.ä. dort erscheinen. Einfach jframe.remove(panel) ?


----------



## Marco13 (27. Sep 2007)

Hm  :? Solche kleinen, schnellen Erfolgserlebnisse (die man mit Java (leider?) sehr viel schneller hat als etwa mit C++) wecken häufig falsche Erwartungen und Illusionen. Man kann zwar mit x.remove(y) Components entfernen, aber es gibt nur wenige Fälle, wo das wirklich Sinn macht. Naja. Das findest du schon noch raus. 

http://java.sun.com/docs/books/tutorial/uiswing/


----------



## Gast (27. Sep 2007)

Aber ein Problem habe ich noch...das ist fast so wichtig wie das davor.

Wie kann ich direkt über Pixel-koordinaten einen Button setzen? Weil nur über die Layouts wird es nicht gerade sehr hübsch. Bzw wie kann man die größe davon ändern?

z.b.:

Fenstergröße: 640x480
Button("Neues Spiel"): Größe 100x30 pixel und sitzt auf Pixel 320/400

Wie geht das?


----------



## Marco13 (27. Sep 2007)

panel.setLayout(null);
panel.add(button);
button.setBounds(320, 240, 100, 30);

Layouts sind i.a. besser, weil sie sich der Fenstergröße anpassen.


----------

