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()") :
L'animation marche bien quand elle est appelée directement.
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); }
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 :
Après plusieurs petits tests et des recherches sur le net, je ne vois pas comment je peux résoudre ce problème .
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;. } });
Si vous avez des idées, merci d'avance !
Partager