Re: warum keine Schleifen und Logik in paintComponent()?
- From: Ernst Baumann <carlox@xxxxxx>
- Date: Thu, 24 May 2007 14:49:36 +0200
1)Ich vermute folgendes:
a) Wenn ich das sleep(300) auskommentiere und das Fenster vergrößere,
wird mir nur noch 1 Kreis dargestellt. Es wird also nicht mehr der
ganze offscreen Bereich auf den Bildschirm kopiert.
(also kein Double-Buffering)
b) Wenn ich dagegen das sleep(300) nicht auskommentiere und das
Fenster vergrößere, werden wieder alle Kreise dargestellt. Es wird
also der ganze offscreen Bereich auf den Bildschirm kopiert.
(also Double-Buffering)
Das heißt man, kann sich nicht verlassen, dass Swing immer
Double-Buffering verwendet, oder?
Da würde ich eher sagen, wenn man den ereignisverarbeitenden Thread
einfriert und dann die Fenstergröße ändert, ist das Ergebnis
undefiniert und hängt im Detail vielliecht auch noch von der Plattform
ab.
Wenn ich das sleep(300) weglasse, und erst dann das Fenster
vergrößere, wird mir nur noch 1 Kreis dargestellt. Es gefriert nichts
ein.
Es wird also nicht mehr der ganze offscreen Bereich auf den Bildschirm
kopiert. Also kein Double-Buffering. Das widerspricht deiner Aussage.
2)
Swing kann Double-Buffering verwenden. Dabei wirdIch habe in der Funktion main diese Schleife (siehe unten) eingebaut
Geflacker und sichtbares Neuzeichnen dadurch vermieden,
dass paint() erst mal alles in einen Puffer zeichnet und dieser
erst nach Abschluss der Methode in einem Rutsch angezeigt wird.
Daher erscheint es so, als ob erst gewartet
und dann gezeichnet wird.
und damit diese "rechenintensive" (statt k < 10 könnte ich auch k <
10000000 schreiben, dann wäre es rechenintensiv) Operation damit
außerhalb des EDT gelegt.
Kann dann dein obiges Argument "nach Abschluss der Methode in einem
Rutsch angezeigt..." mir auch innerhalb von main im Programmausschnitt
unten passieren, d.h 10*100ms warten und dann alles ausgeben (tut es
aber nicht, ich habe es ausprobiert).
Dann hätte ich mit Swing ja immer das Problem, dass meine
Verzögerungen, egal wo ich mich befinde - aufsummiert werden und dann
sich erst mit einem Schlag bemerkbar machen.
Oder wo _muss_ ich meine rechenintensiven Operationn platzieren
(brauche ich dazu unbedingt einen eigenen Thread)?
----------------------------------------
int main(){
while(k<10){
System.out.println("i in main="+i);
diagramm.setI(i);
diagramm.repaint();
i=i+20;
k=k+1;
try{
Thread.sleep(100);
}
catch(Exception e){}
}
....
}
----------------------------------------
3)
Was gehört alles zum EDT ?
Ereignisverarbeeitung, paintComponent(), und was noch?
mfg
Ernst
.
- References:
- warum keine Schleifen und Logik in paintComponent()?
- From: Ernst Baumann
- Re: warum keine Schleifen und Logik in paintComponent()?
- From: Kai Schwebke
- Re: warum keine Schleifen und Logik in paintComponent()?
- From: Ernst Baumann
- Re: warum keine Schleifen und Logik in paintComponent()?
- From: Kai Schwebke
- warum keine Schleifen und Logik in paintComponent()?
- Prev by Date: Re: warum keine Schleifen und Logik in paintComponent()?
- Next by Date: Re: warum keine Schleifen und Logik in paintComponent()?
- Previous by thread: Re: warum keine Schleifen und Logik in paintComponent()?
- Next by thread: Re: warum keine Schleifen und Logik in paintComponent()?
- Index(es):
Relevant Pages
|