Bonjour à tous,
Je suis en train de programme le jeu d'échec. Lorsqu'un pion atteint la dernière ligne, j'aimerais que mon programme principale attende que :
- une fenêtre (JFrame) demande à l'utilisateur s'il veut promouvoir son pion en dame, cavalier, fou ou tour (donc 4 boutons)
- l'utilisateur clique sur un de ces boutons
- suivant ce qu'il a cliqué, le pion est transformé.
Puis, le programme principal reprend son cours.
J'ai essayé de faire, dans mon programme principal un while(estEnAttente), avec estEnAttente un boolean qui deviendrait false lorsque le pion a été transformé (donc que l'utilisateur a cliqué sur le bouton...). Mais le problème est que le programme semble rester coïncé dans cette boucle, et que la fenêtre apparaît, mais reste vide, sans boutons.
J'ai lu des forums et sans doute que je pourrais m'en sortir avec des Thread, mais je ne sais pas comment faire, je suis débutant dans ce domaine.
(Une autre solution serait de faire une boîte de dialogue, mais je n'ai pas trouvé de moyen de faire 4 boutons avec des images personnalisées.)
Au bas de ce message, je vous mets mes bouts de codes pour vous aidez à m'aider. :-)
Merci beaucoup si vous arrivez à me sortir du désespoir.
Cordialement.
--------------------------------
Le programme principal, situer dans la classe nommée actionCases :
La classe créant la boîte de dialogue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 BoiteDeDialoguePromotion prom = new BoiteDeDialoguePromotion(c); estEnAttenteDuChoixDePromotion = true; while(estEnAttenteDuChoixDePromotion); //... suite du programme principal
La classe des boutons est banal, je mets juste la ligne où je crée un listener :
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 public class BoiteDeDialoguePromotion extends JFrame{ private static final long serialVersionUID = 1L; BoiteDeDialoguePromotion(uneCase c) throws FontFormatException, IOException{ Container cp = this.getContentPane(); cp.setLayout(new GridLayout(1,4,0,0)); setTitle("Promotion"); setSize(300, 100); setLocation(900,0); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); BoutonPromotion bouton_dame = new BoutonPromotion(partie.DAME, this, c); BoutonPromotion bouton_cav = new BoutonPromotion(partie.CAVALIER, this, c); BoutonPromotion bouton_fou = new BoutonPromotion(partie.FOU, this, c); BoutonPromotion bouton_tour = new BoutonPromotion (partie.TOUR, this, c); add(bouton_dame); add(bouton_cav); add(bouton_fou); add(bouton_tour); setVisible(true); } }
Et finalement la classe gérant l'action du bouton :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 actionPromotion gestion_bouton = new actionPromotion(); addActionListener(gestion_bouton);
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 public void actionPerformed(ActionEvent arg0) { //Récupération de la provenance de l'événement. BoutonPromotion bouton = (BoutonPromotion) arg0.getSource(); //Il faut supprimer de la liste des pièces le pion promu : partie.getPieces().remove(bouton.getLaCase().getPiece()); //Et on le remplace par la nouvelle promotion if(bouton.getType().equals(partie.DAME)){ partie.getPieces().add(new Dame(partie.getTrait(), bouton.getLaCase())); } if(bouton.getType().equals(partie.FOU)){ partie.getPieces().add(new Fou(partie.getTrait(), bouton.getLaCase())); } if(bouton.getType().equals(partie.TOUR)){ partie.getPieces().add(new Tour(partie.getTrait(), bouton.getLaCase())); } if(bouton.getType().equals(partie.CAVALIER)){ partie.getPieces().add(new Cavalier(partie.getTrait(), bouton.getLaCase())); } //Ferme la fenêtre bouton.getFenetre().setVisible(false); actionCases.setEstEnAttenteDuChoixDePromotion(false); System.out.println("Promotion choisie"); }
Partager