Pouvoir utiliser les listerner pendant une pause

emilio098 Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
j'ai cree un Snake mais depuis que j'ai mis les pauses, les listener des boutons de mon IHM ne marche plus...
Quelqu'un aurait une solution ? Merci d'avance

while(perdu==false){
            Thread.sleep(400);
            if(Deplacement=="haut"){
                déplacerHaut();
            }else if(Deplacement=="bas"){
                déplacerBas();
            }else if(Deplacement=="gauche"){
                déplacerGauche();
            }else if(Deplacement=="droite"){
                déplacerDroite();
            }else{
                if(dernierDeplacement=="haut"){
                    déplacerHaut();
                }else if(dernierDeplacement=="bas"){
                    déplacerBas();
                }else if(dernierDeplacement=="gauche"){
                    déplacerGauche();
                }else if(dernierDeplacement=="droite"){
                    déplacerDroite();
                }
            }
            g.afficher();
        }

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Dans quel contexte ce code s'exécute ? Tu travailles avec Swing, Java FX, autre ?

De manière générale, un listener doit rendre la main le plus vite possible, l'affichage ne sera pris en compte qu'une fois le listener terminé, tu ne dois donc pas faire une boucle infini à l'intérieur d'un listener car sinon ton affichage ne se fera jamais.

Je t'invite à créer une tâche périodique, qui va aller lire le contenu d'une variable de direction que ton listener aura modifié. Ainsi le listener aura juste à faire le set de la variable, qui ne sera pris en compte que lorsque la tâche périodique sera de nouveau appelée.

Exemple de tâche périodique qui affiche l'heure toutes les secondes :

import java.util.Date;
import java.util.concurrent.*;

public class Test {

    public static void action() {
        System.out.println(new Date());
    }

    public static void main(String[] args) {
        Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(Test::action, 0, 1, TimeUnit.SECONDS);
    }
}

Voir la documentation : https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/ScheduledExecutorService.html

Remarque : il ne faut pas comparer des objets avec l'opérateur == qui compare les références, pas les valeurs. Il faut utiliser la méthode equals comme
if(Deplacement.equals("haut"))
par exemple.
0