mehrer grafiken mit delay daziwschen anzeigen

Status
Nicht offen für weitere Antworten.
Hallo, ich habe ein Problem und zwar habe ich einen grafischen Würfel programmiert der per Klich auf einen button eine Zufallszahl zwischen 1 und 6 darstellt. soweit so gut, allerdings möchte dem Benutzer das gefühl geben, das der Würfel wirklich würfelt.
Dazu will ich, dass mehrere Zufallszahlen hintereinander angezeigt werden mit delay dazwischen, welches sich immer weiter verkürzt bis der Würfel letztlich zum stehen kommt.
ich hoffe, ich konnte das einigermaßen sinnig erklären...

Hier mein Quelltext für diese Methode, wie ich es bis jetzt habe (funktioniert aber nicht):
Code:
 public void update()
      {
          int delay=500;
          for (int i=10; i>=0; i--)
          {
              int pips = dm.getPips();
              file = new File("/Uni/OOP/serie05/wuerfel"+pips+".gif");
              this.setImage(file);
              try{Thread.sleep(delay);} catch (InterruptedException e) {}
              delay = delay-40;              
          }
      }

getPips holt sich aus einer anderen Klasse eine Zufallszahl von 1 bis 6.
setImage(File file) habe ich wie folgt implementiert:
Code:
public void setImage(File file )
      {
        image = Toolkit.getDefaultToolkit().getImage( file.getAbsolutePath() );
        if ( image != null )
        repaint();
      }
dann wäre da noch die paintComponent:
Code:
protected void paintComponent(Graphics g)
      {
          if (image != null)
          g.drawImage(image,0,0,this);
          repaint();
      }

update() wird über MouseListener woanders aufgerufen beim Buttonklick. er zeigt auch den Würfel an, allerdings nicht wie ich mir das wünsche und der button bleibt ganz lange gedrückt. als wenn das delay sich nur auf den Button auswirkt... und dann zwichnet er danach halt einen würfel.
er soll aber ja wie gesagt diesen zeichnen, dann kurz warten, ihn dann durch einen anderen ersetzen, dann noch kürer warten usw. bis zum stillstand.

weiss jemand wo der fehler liegt??

vielen dank schonmal im voraus!
 
S

SlaterB

Gast
zunächst mal: alle Bilder im Voraus laden und in ein Array speichern,
deren Ladevorgänge sollen dabei nicht reinpfuschen,

dann im Button einen Thread erzeugen,
der in der run-Operation den Code mit dem Delay enthält,

update bleibt leer, die actionPerformed auch, bis auf das Starten des Threads

Code:
new Thread(new Runnable() {

public void run() {
...

}

}).start();
 
danke erstmal. vielleicht habe ich dich nicht richtige verstanden.
meinen bisherigen code aus der update() soll in deine gepostete maske rein, ja?
wo genau muss ich "new Thread..." erstellen (also das was du gepostet hast)?
update bleibt leer, die actionPerformed auch, bis auf das Starten des Threads
update bleibt leer: is klar. Starten des Threads in ActionPerformed? Wie genau?
kann sein, dass ich mich blöd anstelle, aber ich weiss nicht genau wie das aussehen soll...

vielen dank für die schnelle antwort.
 

Leroy42

Top Contributor
Der ActionListener sollte so aussehen:

Code:
Image[] images = new Image[6];
Image image = null;
...
würfelButton.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    new Thread(new Runnable() {
      public void run() {
        animierterWurf();
      }}).start();
  }});
...

void animerterWurf() {
  int delay=500; 
  for (int i=10; i>=0; i--) { 
    image = images[dm.getPips()];
    repaint();
    try {Thread.sleep(delay);} catch (InterruptedException e) {} 
    delay = delay-40;              
  } 
}

Wie gesagt: Die Images vorher in ein Array laden. Deine paintComponent-Methode
bleibt dann genau wie sie ist.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben