Applet repaint() verlangsamen

Maxx2332

Mitglied
Moin,

wie zu erwarten habe ich ein neues Problem und zwar möchte ich das ein Balken aktualisiert wird mit repaint() und dann kurz gewartet wird und dann wird er nochmal aktualisiert und das immer wieder.

Java:
for(int i = 1; i <= zeitS; i++)
            {
                raeuber.leben(beute, 1);
                beute.leben(raeuber, 1);
                repaint();
                try
                {
                    Thread.sleep( 100 );
                }
                catch ( InterruptedException p )
                {
                    p.printStackTrace();
                }
                
                
            
        }

Nun ist es so das ich es halt mit Thread.sleep verzögern wollte damit man jede Veränderung sieht allerdings passiert dies nicht.


Suche und Google benutzt konnte aber keinen Zusammenhang zu meinem Problem erkennen.
 
Ich vermute mal, dieser Codeausschnitt steht in repaint ?
Du musst dir klar machen, dass die Änderungen dort erst sichtbar werden, wenn die Methode komplett durchlaufen ist.
D.h. wenn du mitten in der Mitte eine Pause einbaust, dann wird der Teil davor trotzdem nicht sichtbar.
Du wirst zuerst das halbe Bild zeichnen müssen und in einem zweiten Aufruf von repaint 100ms später das ganze.

EDIT: okay, da wird repaint aufgerufen, dann steht er vermutlich in einem Button-Click oder ähnlichem ?
Der muss weg dort, das gezeichnete wird ebenso nur sichtbar, wenn eine solche Methode ganz durchlaufen ist.
 
Zuletzt bearbeitet:
Das sollte man dann aber nicht beim zeichnen machen!
Sinnvoller wäre wohl da ein Model zu verwenden, das den aktuellen zustand hält. Und dann dort den zustand zu ändern, wenn es dir recht ist. Anschließend einmal repaint auslösen.

Java:
model.setState(model.getState+1); // Pseudocode für: ändere den Status des Models
component.repaint(); // Neu zeichnen

// in der paintComponent methode:
state = model.getState  // Hol dir die notwenigen Daten aus dem Model
g.drawSomething(state); // zeichne, abhängig von den daten
 
Ich vermute mal, dieser Codeausschnitt steht in repaint ?

Diesen Satz verstehe ich nicht ganz. Ich dachte repaint wäre eine eigenständige Methode die nur von meiner Methode aus aufgerufen werden soll.


Du musst dir klar machen, dass die Änderungen dort erst sichtbar werden, wenn die Methode komplett durchlaufen ist.
okay, da wird repaint aufgerufen, dann steht er vermutlich in einem Button-Click oder ähnlichem ?

Ja es ist ein Button der halt die ganze Methode startet davor ist natürlich noch was dort geht es aber nur ums erfassen der Werte.

Dann wenn ich dich richtig verstanden hab soll ich einmal vor und nach dem sleep ein repaint setzen?
Da die Methode ja erst nach der ganzen For-Schleife zu Ende wäre würde es nicht auf das gleiche hinauslaufen?



@njans

Nett gemeint versteh ich aber nicht, da dies auch mein erstes Applet ist und meine gegebenen Mittel ich sag mal sehr notdürftig sind.

Deswegen wenn du mir das per PN erklären könntest und dir auch sicher bist das es mir hilft wäre ich dir sehr verbunden.
 
Vergeß das mit "im repaint", mein Fehler.
Dein Problem ist, dass du aktuell nur einen Thread hast, nämlich den EDT von Swing.
Dieser ist dafür zuständig, einerseits auf den Button zu reagieren, andererseits aber auch das Bild zu zeichnen.
Soll heißen, wenn du in der Verarbeitung des Buttons wartest, dann kann er solange auch nicht zeichnen -> du siehst nix.

Du brauchst einen eigenen Thread in dem du deinen Code mit dem sleep aufrufst.
 
Nett gemeint versteh ich aber nicht, da dies auch mein erstes Applet ist und meine gegebenen Mittel ich sag mal sehr notdürftig sind.

Deswegen wenn du mir das per PN erklären könntest und dir auch sicher bist das es mir hilft wäre ich dir sehr verbunden.

Ich habe nur keine Ahnung, was genau du da zeichnen willst und inwiefern deine for-Schleife da Auswirkungen drauf hat.
 
Ich habe nur keine Ahnung, was genau du da zeichnen willst und inwiefern deine for-Schleife da Auswirkungen drauf hat.

also diese leben Methode in beute und raeuber verändert die Anzahl der beiden. Da sich meine Balken nach der Anzahl richten müssen sie halt neugezeichnet werden.

Und die For-schleife sagt halt wie oft diese leben methode durchgeführt wird und ich möchte halt das man jede Veränderung sieht.
 
Java:
new Thread() {
public void run() {
// hier deine Schleife
}
}.start();

Dies ist im Endeffeckt die Lösung meines Problems gewesen. Da repaint() das Bild erst neuzeichnet wenn ein Thread beendet ist, da ich aber nur einen Thread habe wird auch nur das letzte Bild gezeichnet.

Daher dieser neue Thread der nur das repaint und Thread.sleep enthält um das malen zu verlangsamen und auch wirklich jeden Schirtt zusehen.
 

Zurück
Oben