Pouvoir utiliser les listerner pendant une pause

Fermé
emilio098 Messages postés 1 Date d'inscription mardi 17 juillet 2018 Statut Membre Dernière intervention 17 juillet 2018 - Modifié le 17 juil. 2018 à 11:23
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 17 juil. 2018 à 11:44
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();
        }
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
17 juil. 2018 à 11:44
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