# Zeichnung verschwindet.



## kali (13. Nov 2006)

hallo liebe programmierer!

ich habe ein problem und zwar:

Ich habe eine kleine swing-applikation programmiert in der ich auf einen jframe zeichne.
Mein problem ist nun, dass wenn ich das fenster aus dem bildschirm hinaus- und wieder zurückziehe der teil der draußen war nicht mehr wieder gezeichnet wird! dieser teil ist somit verloren!

was kann ich denn dagegen machen?
hab mal was von doublebuffering gehört, allerdings hab ich keine ahnung wie das funktioniert und ob mir das überhaupt hilft.

danke im voraus
mfg kali


----------



## Bert Brenner (13. Nov 2006)

Schreib doch mal ein bischen Code wie du zeichnest.


----------



## kali (13. Nov 2006)

ich erspare euch lieber den code:

aber ganz einfach:

Ich lege mit ein graphics objekt an - 
	
	
	
	





```
Graphics g = this.getGraphics;
```
 - und z.B. mit 
	
	
	
	





```
g.drawLine(....)
```
 zeichne ich dann auf meinen JFrame.
Also ganz primitives Zeichnen 

genügt das fürs erste mal?

danke schon mal
mfg kali[/code]


----------



## Bert Brenner (13. Nov 2006)

mach besser folgendes


```
public void paintComponent(Graphics g){
  //hier zeichnest du dann
}
```

und vergiss das getGraphics.

PS: paintComponent brauchst du nicht selbst aufrufen, sonder das geschieht automatisch wenn dein JFrame neu gezeichnet werden muss.


----------



## kali (13. Nov 2006)

dann muss ich aber wiederum von JPanel ableiten und nicht von JFrame!

oder?


----------



## Bert Brenner (13. Nov 2006)

Nein, das geht beim JFrame genauso.


----------



## kali (13. Nov 2006)

allerdings zeichne ich in verschiedenen funktionen... und das funktioniert dann nicht so ganz.

und das automatische aufrufen funktioniert auch nicht wirklich...

mfg kali


----------



## kali (13. Nov 2006)

ein beispielcode für die verwendung von 
	
	
	
	





```
paintComponents(Graphics g)
```
 wäre nett!
weil bei mir das nicht wirklich funktioniert...

danke kali


----------



## AlArenal (13. Nov 2006)

Man sollte schon richtig abschreiben könnnen


----------



## kali (13. Nov 2006)

falls du auf das *S* anspielen möchtest!

kann ich nur sagen, dass keine Funktion paintComponent(...) existiert.
zumindest kennt mein Eclipse bzw. die Klasse Container welche von Component ableitet kein paintComponent(...)
sondern eben nur ein paintComponents(...)
demnach gehe ich davon aus, dass man es mit s schreibt.


----------



## Wildcard (13. Nov 2006)

Bei einem JFrame müsstest du AWT-like die paint Methode überschreiben.
Ist aber sehr unschön. Besser auf eine JComponent zeichnen und dort paintComponent überschreiben.


----------



## kali (13. Nov 2006)

nachdem mir wie oben zu lesen gesagt wurde, dass es auch mit einem JFrame geht versuche ich dies auch weiterhin.
soweit ich bis jetzt herausgefunden habe funktioniert das ganz mit paintComponent(...) nur mit einem JPanel und nicht mit einem JFrame... wo wir wieder bei der Frage wären ob das ganze mit einem JFrame wirklich ordentlich funktioniert oder nicht


----------



## Wildcard (13. Nov 2006)

Wie gesagt: Man kann direkt auf einen JFrame zeichnen in dem man paint überschreibt, sollte es aber nicht tun da JFrame Heavyweight und daher etwas anders als die anderen Swing Komponenten ist.


----------



## kali (13. Nov 2006)

kann ich auf einem JPanel auch beinahe die selben funktionen nutzen wie auf einem JFrame, wie z.b. auf mausklick reagieren und dann dort etwas zeichnen usw...

kali


----------



## Wildcard (13. Nov 2006)

Wenn du selbst zeichnen willst brauchst du kein JPanel, JComponent reicht völlig, und ja, kannst du.


----------



## kali (13. Nov 2006)

irgendwie reagiert er aber auf meine tastatureingaben nicht!

und ich habe noch eine frage... wenn ich nun in mehreren funktionen etwas zeichne, was eben von den mausklicks abhängt, wie kann ich auch das wiederherstellen?

kali


----------



## Wildcard (13. Nov 2006)

Nur Komponenten die den Focus haben erhalten KeyEvents.

Bitte? Du zeichnest nur in einer Methode: paintComponent(Graphics g)
Und was meinst du mit 'wiederherstellen'  :?:


----------



## kali (13. Nov 2006)

ok:
Als erstes zeichne ich in meinem Programm ein Koordinatensystem.
Je nach dem wo ich mit der Maus hinklicke soll ein Feld im Koordinatensystem ausgefüllt werden.
Eben jenes in welches ich geklickt habe.
Wie kann ich also in einer beliebigen Funktion z.B. mouseClicked(...) zeichnen wenn es benötigt wird.

und mit wiederherstellen meine ich wenn es einmal aus dem bildschirm hinausgeschoben wurde und wieder zurück, dass es wieder angezeigt wird.

aber gut war auch wirklich nicht eindeutig... sry

also muss ich dem component den focus geben wenn ich das richtig verstanden habe...

kali


----------



## Wildcard (13. Nov 2006)

Falscher Ansatz. Du zeichnest passiv in Java. Daher brauchst du ein Datenmodell das dir erlaubt deine Zeichnung zu jedem Zeitpunkt zu wiederholen (in deinem Fall also sowas wie eine Liste mit Punkten). In paintComponent wird dann der aktuelle Zustand des Modells gezeichnet.


----------



## kali (13. Nov 2006)

ja an so etwas hab ich schon gedacht...
das ganze ist also doch umständlicher als angenommen...

naja danke fürs erste. vl fällt mir ein bisschen später noch was ein.


----------



## Wildcard (13. Nov 2006)

Nein, eigentlich ist es einfach als die Art wie du gedacht hast das es funktioniert  :wink:


----------



## kali (13. Nov 2006)

naja wie mans nimmt


----------

