Bonjour tout le monde,

J'ai un soucis de Listener.

Dans un jeu de puissance4, j'ai fait une animation qui permet de faire descendre un pion quand on le pose.

Voici le code de cet animation qui se trouve dans la classe du JPanel sur lequel le pion se déplace (l'animation est appelée par la fonction "repaintColonne()") :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
    void repaintColonne(){
        //Boucle qui realise le deplacement
        for(int i=-50 ; i< 251 - hauteur * 50 ; i++){
            indice=i;
            this.repaint();
            //Temps d'attente entre deux passages
            try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}
        }
        //Nombre de pion déjà posé sur la colonne
        hauteur++;
    }
 
   public void paintComponent(Graphics g){
 
        g.setColor(Color.red);
 
        //Affichage des cases de la colonne qu'il est nécessaire de rafraichir
        afficherBackground(g);
 
        //A l'initialisation on affiche rien de plus
        if(initialisation){
            initialisation=false;
        }
 
        else{
 
            try {
                //On affiche un pion correspondant au joueur courant
                if(vf.getJoueurCourant())
                    img = ImageIO.read(new File("src/Images/Pion1.png"));
                else
                    img = ImageIO.read(new File("src/Images/Pion2.png"));
 
                //On affiche l'image
                g.drawImage(img, 0,   indice, 50, 50, this);
 
            } catch (IOException ex) {Logger.getLogger(PanneauPion.class.getName()).log(Level.SEVERE, null, ex);}
 
        }
    }
 
    //Affichage des cases
    void afficherBackground(Graphics g){
        if(estPair){g.setColor(Color.DARK_GRAY);}
        else{g.setColor(Color.LIGHT_GRAY);}
        if(hauteur<6) g.fill3DRect( 0,   0, 50, 50, true);
        if(hauteur<4) g.fill3DRect(0, 100, 50, 50, true);
        if(hauteur<2) g.fill3DRect(0, 200, 50, 50, true);
 
        if(estPair){g.setColor(Color.LIGHT_GRAY);}
        else{g.setColor(Color.DARK_GRAY);}
 
        if(hauteur<5) g.fill3DRect(0,  50, 50, 50, true);
        if(hauteur<3) g.fill3DRect(0, 150, 50, 50, true);
        if(hauteur<1) g.fill3DRect(0, 250, 50, 50, true);
    }
L'animation marche bien quand elle est appelée directement.

Or je ne voudrais pas l'appeler directement mais à partir d'un Listener.
Le problème est que quand j'appuie sur le bouton correspondant à l'ActionListener, la fenetre "semble" freezer. Le bouton sur lequel j'ai clické reste appuyé et après quelques secondes le pion s'affiche en bas de la colonne souhaitée.

L'animation n'a donc pas lieu.
Le temps de "freeze" correspond en fait au temps que met le pion à descendre. L'action a bien donc lieu mais l'affichage ne se fait pas (bien que tout cela marchait à partir d'un appel direct)


Voici le code de l'ActionListener qui se trouve dans la classe derivée de JFrame de mon puissance4 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
         panelBoutons.getBoutonColonne()[3].addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                panelDamier.getPanneauColonne()[0].repaintColonne();
                joueurCourant=!joueurCourant;.
            }
        });
Après plusieurs petits tests et des recherches sur le net, je ne vois pas comment je peux résoudre ce problème .

Si vous avez des idées, merci d'avance !