Sleep - Funktion, die nicht wirklich funktionieren will

Davren2007

Grünschnabel
Hallo zusammen
Ich bin gerade dabei, ein Skat Programm zu schreiben und da ich etwas Animation in meinem Spiel haben will, bin ich grad dabei, die Sprechblasen von meinen KI-Gegnern mit Java Swing zu animieren. Dies sollte doch EIGENTLICH mit der sleep Funktion funktionieren, oder? Hier ein kleiner Ausschnitt von der Stelle:
Code:
public static void WerteTabelle(int reiz, boolean k) throws InterruptedException {
          
        if(reiz == 18 && k == false){ 
            GUI.ki1Spiel[1].setVisible(true);
            Thread.sleep(1000);
            GUI.ki1Spiel[1].setVisible(false);
        }
Eigentlich müsste ich doch das Bild für eine Sekunde sehen, oder? Bei mir hält das Programm jedoch nur die Zeit an (Ich seh das über die Konsolenausgabe). Aber er zeigt mir dieses Bild nicht an..... Was kann ich dagegen machen?
Ps: Ich habs auch mit try und catch probiert, jedoch auch erfolgslos =(
 
Hallo,

welchen Thread bremst du dort aus ? ?

Evtl. liegt darin dein Problem, dass du einen Thread schlafen schickst der
irgendwie für das Oberflächenmanagement benötigt wird !

Das bedeutet dann das er garnicht zum Sichtbarmachen kommt, weil er
dort rumschnarcht, z z Z und nach dem Wecken ist ja eh wieder "Unsichtbar" dran !

Gruß JAdix
 
Hallo,

am besten, auch als generelle Regel, nur einen Thread schlafen schicken,
den man selbst instanziiert hat.

Du solltest Dir also einen eigenen Animations-Thread basteln und diesen,
nur kurz zum laufen bringen, um dem Thread der diesen Anstoss liefert die
möglichkeit zu geben sofort mit seiner eigentlichen Arbeit für die er zuständig
ist fortzufahren !

Gruß JAdix
 
Eine weitere Lösung liesse sich mit java.util.Timer und java.util.TimerTask realisieren. Du erstellst einen Timer, welcher neue TimerTasks zugewiesen bekommt. Diese Timer Tasks implementieren das unsichtbar machen der Sprechblasen. Neben dem einmaligen Erstellen eines Timers müsstest du den Aufruf wie folgt ändern:

Code:
public static void WerteTabelle(int reiz, boolean k) throws InterruptedException {
          
        if(reiz == 18 && k == false){ 
            GUI.ki1Spiel[1].setVisible(true);
            /* timer ist eine Instanz der Timer Klasse. Der SpeechBubbleDisabler
             * soll in 1000 Millisekunden ein eniziges mal aktiviert werden.
             */
            timer.schedule(new SpeechBubbleDisabler(GUI.ki1Spiel[1]), 1000);
        }
<snip>

Diese Hilfsklasse bräuchtest du auch noch:

Code:
public class SpeechBubbleDisabler extends TimerTask {
        /* Da ich nicht weiss wie die Klasse heisst, welche GUI.ki1Spiel[1]
         * repräsentiert habe ich sie Player genannt. Der Name müsste entsprechend
         * angepasst werden.
         */
        private Player player;

        public SpeechBubbleDisabler(Player player) {
            this.player = player;
        }

        public void run() {
            this.player.setVisible(false);
        }
}
 
Zurück