Zeitmessung springt vorraus und funktioniert nicht!

SombraOscura

Mitglied
Hallo Liebe Community,

Ich hänge Momentan an folgendem Problem:
Als Schulprojekt sollen mein Gruppenpartner und ich ein "Mensch ärgere dich nicht" Spiel programmieren, welches mit in die Abi-Note fließen wird. Das Spiel steht soweit und ist voll spielbar. Um es grafisch etwas besser zu gestallten, dachten wir uns beim Würfeln eine Gif über ein Label einzufügen. Da uns keine Möglichkeit eingefallen ist die Gif auf dem letzten Frame zu stoppen, dachten wir uns, nach einer gewissen Zeit das letzte Bild, extra auf das Label zu laden und somit die Gif praktisch überspielen. Realisieren wollten wir dieses Abwarten der gewissen Zeit durch eine:
Java:
{
      Thread.sleep(millisekwait); // Millsekunden
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
in einer externen Methode.
Gleiches versuchten wir über eine Rechnung mit System.currentTimeMillis().

Hier der gesamte Quelltext für unsere Lösung mit der Gif:
Java:
private void spieleGif(){
    for (int i=0;i<11 ;i++ ) {                                                  //Spielfeld unsichtbar machen
      for (int j=0;j<11 ;j++ ) {
        dieGUI.aktualisiereFeld(i,j,Color.LIGHT_GRAY,false,null);
      } // end of for
    } // end of for  
    dieGUI.lblWuerfel.setVisible(true);                                         //Label für die Gif sichtbar machen
    dieGUI.lblWuerfel.setIcon(iconWuerfel[1][0]);                               //Gif in das Label laden
    dieGUI.warten(1000);                                                        //Wartefunktion aufrufen
    //dieGUI.lblWuerfel.setIcon(iconWuerfel[1][1]);                               //Letztes Bild der Gif in das Label laden
  }

Das Problem ist nun, dass das Programm zuerst die warte aufruft, was durch einfrieren sichtbar wird (was nebenbei ebenso wenig sein soll) und erst danach die Gif lädt :bahnhof: .
Wie schaffen wir es die Gif aufzurufen, dann nebenher die Zeit zuzählen, ohne das Programm einzufrieren, um danach das letzte Bild laden zu können.
Vielen Dank im Voraus!

MfG SombraOscuro
 
Mithilfe von Multithreading. Den EDT sollte man niemals pausieren sonst passiert das was ihr feststellt.

Erstellt einen neuen Thread den ihr dann pausiert und das Icon setzt.
 
Vielen Dank. Werde mich direkt daran versuchen. Hast du zufälliger Weise direkt eine gute Seit, bei der man sich in Threads gut einarbeiten kann? Wäre super! 🙂
 
Naja bei Swing verwendet man normalerweise die "SwingWorker" Klasse, da Multithreading und GUIs nicht zusammenpassen.
Die enthält eigentlich alles was du brauchst und man muss sich auch nicht in Multithreading einarbeiten was unter umständen sehr kompliziert und frustrierend werden kann, nicht weil das Thema kompliziert ist sondern weil Fehler auftauchen werden die man so vorher nicht kannte und auch nicht einschätzen kann.

Die SwingWorker Klasse nimmt das aber für dich ab.

Ein gutes Code-Beispiel das genau in deine Richtung geht:
animation - How do I use SwingWorker in Java? - Stack Overflow
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben