# Bild DIREKT in JFrame einfügen



## powerpaar (5. Nov 2011)

Ich komme mir vollkommen bescheuert vor: 

Ansonsten bin ich nicht unbedingt auf den Kopf gefallen, aber wenn ich danach suche, wie man einfach nur ein Bild in einen JFrame einbinde (OHNE JPanel oder etwas anderes), dann kommt entweder doch im Laufe der Beiträge "ach, ich mach doch ein JPanel" oder "schreib doch einfach die drawImage()-Methode um". :noe:

Das erstaunliche ist: die meisten scheinen keinerlei Probleme damit zu haben. ;(


_Ich ersuche euch deswegen um dringende Hilfe bei folgendem Problem: _

Ich möchte ein Bild an einer BELIEBIGEN Position in einem bereits mit JPanels gefüllten *JFrame* ablegen. Die JPanels sind dabei wichtig, d.h. ich muss das Bild DARÜBER hinweg bewegen und ich kann sie auch nicht mit dem gewünschten Bild füllen. Stellt euch also einfach vor, ein Bild an einer bestimmten Postion (Koordinaten) in einem JFrame (und nicht in den JPanels) malen zu lassen. 

Bisher habe ich einfach das Bild in einer Klasse, die JFrame extendet, geholt via


```
Image img = Toolkit.getDefaultToolkit().getImage("./test.jpg");
```

und später in einer Methode, die Zugriff auf das Bild hat und ebenfalls zum JFrame gehört, folgendes angewandt:


```
Graphics g = getGraphics(); (etwas stümperhaft, ich weis)
g.drawImage(img, x, y, this);
```

*Diese Methode wird auch aufgerufen, es funktioniert auch alles, solange ich "testweise" nur mit g.drawString(...) arbeite. Aber dieses Bild will einfach nicht.*

Ich bin verzweifelt, sitze schon geschlagene 6 Stunden davor und kapier es nicht! Bitte helft mir!


----------



## GUI-Programmer (5. Nov 2011)

Ich denke du solltest dafür  ne GlassPane verwenden. The Glass Pane

In etwa so (muss nicht so komplex wie in den Beispiel sein!):

```
//...
public class MyGlassPane extends JComponent {
    private Image image;
    private int x, y;
    
    public void drawImage(Image image, int x, int y) {
    	this.image = image;
    	this.x = x;
    	this.y = y;
    	repaint();
    }
    
    @Override
    protected void paintComponent(Graphics g) {
    	if(image != null) g.drawImage(image, x, y, this);
    }
}
//...
MyGlassPane glasspane = new MyGlassPane();
frame.setGlassPane(glasspane);
frame.getGlassPane().setVisible(true);
// und, falls du einen MouseListener hast, der das Bild zeichnen soll,
// musst du diesen auch die Instanz mitgeben:
derMouseListener.setGlassPane(glasspane);
```


----------



## powerpaar (5. Nov 2011)

Ok, danke, das ist schon etwas durchsichtiger (Vorsicht: Wortwitz!:lol: - mal über schlechte Witze lachen...)

Danke schon mal dafür. Aber was genau tust du dort?  Der obere Teil ist klar, aber was z.B. machst du bei 

```
frame.setGlassPane(glasspane);
```

?
:reflect:

Ach ja, ich habe es ausprobiert. Wenn ich das richtig verstehe, muss ich ja zum Zeichnen einfach folgende Zeilen aufrufen:


```
glasspane.drawImage(img,x,y);
glasspane.paintComponent(g);
```

Allerdings hat das bei mir wieder mal nicht funktioniert.... hmpf....:roll:

Trotzdem dankeschön. Ist erst mal eine gute Denkrichtung.


----------



## GUI-Programmer (5. Nov 2011)

powerpaar hat gesagt.:


> Danke schon mal dafür. Aber was genau tust du dort?  Der obere Teil ist klar, aber was z.B. machst du bei
> 
> ```
> frame.setGlassPane(glasspane);
> ```



Wie die Methode schon aussagt - Ich weise den JFrame die GlassPane zu, siehe den geposteten Link!

Ach, und falls du nur ein Image hast, das du zeichnen willst, reicht es natürlich aus dieses in der GlassPane zu erzeugen und nur dieses zu zeichen. Die drawImage()-Methode habe ich mir gedacht könnte nütlich sein, wenn du verschiedene Bilder an verschiedene Position des JFrames zeichnen willst.


----------



## powerpaar (5. Nov 2011)

Eine kurze Frage am Rande: Mache ich denn alles richtig beim Importieren des Bildes? Vielleicht bin ich einfach schon zu meschugge dafür und mache was falsch. 

Ich wende den oben beschriebenen Code an 


```
img = Toolkit.getDefaultToolkit().getImage("test.jpg");
```
und das Bild befindet sich genau dort, wo sich auch die Klassen befinden (d.h. ist in NetBeans, welches ich hier verwende, direkt mit den Klassen zu sehen..... )Deutlicher gesagt steht dann da so etwas wie 

ProgrammName
-> Quellpakete
_->HauptPaket
__->Klasse1
__->Klasse2
__->...
__->MyGlassPane
__->meinJayFreyme
__->_test.jpg_

Ist das so richtig? Oder völliger Blödsinn? Ich hab das schon ein, zwei Mal gemacht, aber ich bin in so was auch nicht unbedingt erfahren.


----------



## L-ectron-X (5. Nov 2011)

Das könnte helfen: http://wiki.byte-welt.net/wiki/Grafikdateien_laden_und_anzeigen


----------



## powerpaar (5. Nov 2011)

L-ectron-X hat gesagt.:


> Das könnte helfen: http://wiki.byte-welt.net/wiki/Grafikdateien_laden_und_anzeigen



Danke, kannte ich soweit leider schon.


----------



## powerpaar (5. Nov 2011)

GUI-Programmer hat gesagt.:


> Ach, und falls du nur ein Image hast, das du zeichnen willst, reicht es natürlich aus dieses in der GlassPane zu erzeugen und nur dieses zu zeichen. Die drawImage()-Methode habe ich mir gedacht könnte nütlich sein, wenn du verschiedene Bilder an verschiedene Position des JFrames zeichnen willst.



Ja, so was möchte ich später auch  - erst mal muss eines klappen, der Rest kommt dann.


----------



## powerpaar (6. Nov 2011)

Ok, ich habe es jetzt etwas anders gelöst: Ich habe eine geometrische Figur statt des Bildes genommen. Natürlich funktioniert DAS wieder einwandfrei. Aber zufriedenstellend ist das nicht. Hat sonst noch jemand einen Vorschlag?


----------

