Bonjour,

Je suis en train de faire un petit jeu pour le plaisir et sans prétentions !!! cela m'aide aussi à me rappeller pleins de choses de java et à m'améliorer.


J'ai une interface graphique qui demande à l'utilisateur de donner le nombre de joueurs, et seulement lorsque le nombe de joueurs aura été donné, je souhaite changer le panneau JPanel pour demander les prénoms des joueurs.

Donc il y a une méthode qui crée le panneau pour demander le nombre des joueurs, il retourne au controleur cette donnée, et ensuite je souhaite créer une méthode qui affichera dans le même panneau la demande des prénoms des joueurs une fois que le nombre des joueurs aura été défini.

Mon problème est que si, dans le controleur, je mets les méthodes à la suite la jvm va les exécuter sans attendre que la donnée "nbreJoueurs" soit définie.

Voici mon code pour plus de clarté :
Le controleur :
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
package ctrl;
 
import modeles.Joueur;
import vues.Cadre;
 
public class Control {
 
	Cadre cadre = null;
	Joueur joueur = null;
 
	int nbreJoueurs;
 
	public static void main(String[] args) {
		Control ctrl = new Control();
	}
 
//*********CONSTRUCTEUR***********
	public Control() {
		//affichage de l'interface graphique
		Cadre cadre = new Cadre(this);
 
		//attente
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
 
		//affichage question nombre de joueurs
		cadre.initNbreJoueurs();
 
 
	}
 
//*********METHODES***********
	public int getNbreJoueurs() {
		return this.nbreJoueurs;
	}
 
	public void setNbreJoueurs(int nbreJoueurs_) {
		this.nbreJoueurs = nbreJoueurs_;
 
		cadre.initPrenoms(nbreJoueurs_);
	}
 
}
Donc on voit qu'à la ligne 30, j'appelle la méthode pour demander le nbreJoueurs. Cela passe par une classe "Cadre" (JFrame), qui envoie à une classe PanneauPrincipal (JPanel), dans lequel se trouvent plusieurs panneaux rangés dans un Layout. et c'est finalement la classe PanDes_CENTER qui reçoit et exécute (à partir de ligne 35) la fonction déclenchée dans la classe "Control".

Ici la classe PanDes_center :
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package vues.panneaux;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
import ctrl.Control;
 
public class PanDes_center extends JPanel {
 
	private static final long serialVersionUID = 1L;
 
	Control ctrl = null;
 
	int xPanSize, yPanSize, nbreJoueurs;
 
	JLabel l1;
	JTextField jtf;
	JButton button;
 
	public PanDes_center(Control ctrl_, int xPanSize_, int yPanSize_) {
		this.ctrl = ctrl_;
		this.xPanSize = xPanSize_;
		this.yPanSize = yPanSize_;
		this.setPreferredSize(new Dimension(xPanSize, yPanSize));
	}
 
	public void initNbreJoueurs() {
 
 
	    l1 = new JLabel("Quel est le nombre de joueurs ? (entre 2 et 7 joueurs)");
 
	    Font font = new Font("Arial", Font.BOLD, 35);
 
	    l1.setFont(font);
	    l1.setBounds(xPanSize / 6, yPanSize / 2, 1000, 100);
	    this.add(l1);
 
	    jtf = new JTextField("2", 10);
	    jtf.setBackground(Color.cyan);
	    jtf.setBounds(xPanSize / 6, yPanSize / 2 + 100, 100, 50);
	    jtf.setFont(font);
 
	    this.add(jtf);
 
	    button = new JButton("Valider");
	    button.setBounds(xPanSize / 6 + 200, yPanSize / 2 + 100, 200, 50);
	    button.setFont(font);
 
	    this.add(button);
 
	    this.setBackground(Color.GRAY);
 
	    button.addActionListener(new ActionListener() {
 
			@Override
			public void actionPerformed(ActionEvent e) {
				String text = jtf.getText();
 
				if (text.matches("^([2-7])$")) {
					ctrl.setNbreJoueurs((int) Integer.parseInt(text));
				}
			}
		});
	}
 
 
	public void initPrenoms(int nbreJoueurs_) {
 
	}
}
Dans cette classe, j'affiche la demande du nbreJoueurs (ligne 38) et l'utilisateur Valide sur par JButton (ligne 53). Dans l'ActionListener (lignes 61 à 71), cela déclenche une fonction setNbreJoueurs de la classe "Control" (en ligne 40).
Cela met bien la variable nbreJoueurs à jour mais je ne vois pas comment je pourrais appeller une nouvelle fonction demandant les prénoms des joueurs à la suite de la fonction qui demande le nbreJoueurs dans la classe Control, ligne 30... la JVM exécuterait les deux fonctions à la suite sans attendre que l'utilisateur clique sur le bouton Valider pour le nbreJoueurs ....

Pas facile à expliquer ....

Du coup, je poste ici toutes mes autres classes pour plus de clarté si vous souhaitez reconstituer chez vous !

Cadre :
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
package vues;
 
import javax.swing.JFrame;
 
import ctrl.Control;
 
public class Cadre extends JFrame {
 
	/**
         * 
         */
	private static final long serialVersionUID = 1L;
 
	Control ctrl = null;
	PanneauPrincipal panneau = null;
 
	//*********CONSTRUCTEUR*********
	public Cadre(Control ctrl_) {
		this.ctrl = ctrl_;
 
		panneau = new PanneauPrincipal(ctrl);
 
		//paramétrages cadre
	    this.setTitle("Jeu de dés");
	    this.setContentPane(panneau);
//	    this.setLocationRelativeTo(null);	//fenêtre centrée à l'écran
	    this.pack();
	    this.setVisible(true);
	    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    this.setResizable(false);
	}
 
 
	//*********METHODES*********
	public void initNbreJoueurs() {
		panneau.initNbreJoueurs();
	}
 
	public void initPrenoms(int nbreJoueurs_) {
		panneau.initPrenoms(nbreJoueurs_);
	}
}
PanneauPrincipal :
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package vues;
 
import java.awt.BorderLayout;
import java.awt.Toolkit;
 
import javax.swing.JPanel;
 
import ctrl.Control;
import vues.panneaux.PanActualScore_east;
import vues.panneaux.PanCommands_south;
import vues.panneaux.PanDes_center;
import vues.panneaux.PanScores_north;
 
public class PanneauPrincipal extends JPanel {
 
	/**
         * 
         */
	private static final long serialVersionUID = 1L;
 
	Control ctrl = null;
	PanDes_center des = null;
	String text;
	int nbreJoueurs;
 
	public PanneauPrincipal(Control ctrl_) {
 
		this.ctrl = ctrl_;
 
		this.setPreferredSize(Toolkit.getDefaultToolkit().getScreenSize());
 
		//Récupération de la taille de l'écran afin de gérer les tailles de Panels
		Toolkit tk = Toolkit.getDefaultToolkit();  
		int xScreenSize = ((int) tk.getScreenSize().getWidth());  
		int yScreenSize = ((int) tk.getScreenSize().getHeight()); 
 
		//insertions des différents panneaux
		this.setLayout(new BorderLayout());
 
		//Paramétrages des dimensions de tous les sous panneaux
		int xPanNorth = xScreenSize;
		int yPanNorth = (int) Math.round(yScreenSize * 0.2);
 
		int xPanSouth = xScreenSize;
		int yPanSouth = (int) Math.round(yScreenSize * 0.1);
 
		int xPanEast = (int) Math.round(xScreenSize * 0.2);
		int yPanEast = (int) Math.round(yScreenSize * 0.3);
 
		int xPanCenter = (int) Math.round(xScreenSize * 0.8);
		int yPanCenter = (int) Math.round(yScreenSize * 0.3);
 
		PanScores_north scores = new PanScores_north(xPanNorth, yPanNorth);
		PanCommands_south commandes = new PanCommands_south(xPanSouth, yPanSouth);
		PanActualScore_east actualScore = new PanActualScore_east(xPanEast, yPanEast);
		des = new PanDes_center(ctrl, xPanCenter, yPanCenter);
 
		this.add(scores ,BorderLayout.NORTH);
		this.add(des,BorderLayout.CENTER);
		this.add(actualScore,BorderLayout.EAST);
		this.add(commandes,BorderLayout.SOUTH);		
	}
 
	public void initNbreJoueurs() {
		des.initNbreJoueurs();
	}
 
	public void initPrenoms(int nbreJoueurs_) {
		des.initPrenoms(nbreJoueurs_);
	}
}
PanActualScore :
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
58
59
60
61
62
package vues.panneaux;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
 
import javax.swing.JPanel;
 
public class PanActualScore_east extends JPanel {
 
	int xTextPos;
	int yTextPos;
 
	public PanActualScore_east(int xPanSize, int yPanSize) {
 
		this.xTextPos = (int) Math.round(xPanSize / 4);
		this.yTextPos = (int) Math.round(yPanSize / 2);
 
		this.setPreferredSize(new Dimension(xPanSize, yPanSize));
 
		this.setLayout(new FlowLayout(1, 0, (int) Math.round(yPanSize / 2)));	//FlowLayout​(int align, int hgap, int vgap)
 
		this.setBackground(Color.GREEN);
	}
 
    public void paint(Graphics g) {
        super.paint(g);
        Color c = g.getColor();
//        g.setColor(Color.RED);
//        g.fillRect(10,20,80,80);
//        g.setColor(Color.YELLOW);
//        g.fillOval(100,50,80,80);
        g.setFont(new Font("default", Font.BOLD, 15));
        g.setColor(Color.MAGENTA);
        g.drawString("Dé 1", xTextPos, yTextPos);
        g.setColor(Color.RED);
        g.drawString("1", xTextPos + 5, yTextPos + 20);
        g.setColor(Color.MAGENTA);
        g.drawString("Dé 2", xTextPos, yTextPos + 40);
        g.setColor(Color.RED);
        g.drawString("5", xTextPos + 5, yTextPos + 60);
        g.setColor(Color.MAGENTA);
        g.drawString("Dé 3", xTextPos, yTextPos + 80);
        g.setColor(Color.RED);
        g.drawString("5", xTextPos + 5, yTextPos + 100);
        g.setColor(Color.MAGENTA);
        g.drawString("Dé 4", xTextPos, yTextPos + 120);
        g.setColor(Color.RED);
        g.drawString("3", xTextPos + 5, yTextPos + 140);
        g.setColor(Color.MAGENTA);
        g.drawString("Dé 5", xTextPos, yTextPos + 160);
        g.setColor(Color.RED);
        g.drawString("5", xTextPos + 5, yTextPos + 180);
 
        g.setColor(Color.MAGENTA);
        g.drawString("Total", xTextPos, yTextPos + 220);
        g.setColor(Color.RED);
        g.drawString("600", xTextPos + 5, yTextPos + 240);
    }
}
PanCommands_south :
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
58
59
60
61
62
63
64
package vues.panneaux;
 
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
import java.io.IOException;
 
import javax.swing.JButton;
import javax.swing.JPanel;
 
public class PanCommands_south extends JPanel {
 
	public PanCommands_south(int xPanSize, int yPanSize) {
		this.setLayout(new FlowLayout(1, xPanSize / 8, 0));	//FlowLayout​(int align, int hgap, int vgap)
 
		this.setPreferredSize(new Dimension(xPanSize, yPanSize));
 
		//calculs des tailles pour les boutons
		int heightBout = (int) Math.round(yPanSize * 0.8);
		int widhtBout = (int) Math.round(xPanSize * 0.45);
 
		//calcul des tailles de fonts
		int sizeFont = (int) Math.round(xPanSize * 0.02);
 
		//Load font from file
		Font font = null;
		try {
			font = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("/font/Eracake.ttf"));
		} catch (FontFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
		GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
		ge.registerFont(font);
 
		JPanel panLancer = new JPanel();
		JPanel panArret = new JPanel();
 
		panLancer.setPreferredSize(new Dimension(xPanSize / 3, yPanSize));
		panArret.setPreferredSize(new Dimension(xPanSize / 3, yPanSize));
 
		JButton boutLancer = new JButton("Lancer les des"); 
		JButton boutArreter = new JButton("Arreter le tour");
 
		boutLancer.setPreferredSize(new Dimension(widhtBout, heightBout));
		boutArreter.setPreferredSize(new Dimension(widhtBout, heightBout));
 
		boutArreter.setFont(new Font("Eracake", font.ITALIC, sizeFont));
		boutLancer.setFont(new Font("Eracake", font.ITALIC, sizeFont));
 
 
		panLancer.add(boutLancer);
		panArret.add(boutArreter);
 
		this.add(panLancer);
		this.add(panArret);
	}
}
PanPersonalScore :
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
package vues.panneaux;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
 
import javax.swing.JPanel;
 
public class PanPersonalScore extends JPanel {
 
	int xScreenSize;
	int xPanSize;
	int xTextPos;
	int yTextPos = 40;
	int rank;
 
	public PanPersonalScore(int xScreenSize_, int yPanSize, int rank_) {
		this.xScreenSize = xScreenSize_;
		this.xPanSize = (int) Math.round( xScreenSize / 8);
		this.xTextPos = (int) Math.round(xPanSize / 4);
		this.rank = rank_;
 
		this.setPreferredSize(new Dimension(xPanSize, yPanSize));
	}
 
    public void paint(Graphics g) {
        super.paint(g);
        Color c = g.getColor();
//        g.setColor(Color.RED);
//        g.fillRect(10,20,80,80);
//        g.setColor(Color.YELLOW);
//        g.fillOval(100,50,80,80);
        g.setFont(new Font("default", Font.BOLD, 15));
        g.setColor(Color.MAGENTA);
        g.drawString("JOUEUR " + (rank + 1), xTextPos, yTextPos);
        g.setColor(Color.GREEN);
        g.drawString("LILIE", xTextPos, yTextPos + 20);
        g.setColor(Color.MAGENTA);
        g.drawString("SCORE ", xTextPos, yTextPos + 50);
        g.setColor(Color.GREEN);
        g.drawString("1250", xTextPos, yTextPos + 70);
    }
}
PanScores_north :
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
package vues.panneaux;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
 
import javax.swing.JPanel;
 
public class PanScores_north extends JPanel {
 
	public PanScores_north(int xPanSize, int yPanSize) {
 
		this.setPreferredSize(new Dimension(xPanSize, yPanSize));
 
		//hauteur du panneauPersonnel affiché
		int yPanPersSize = (int) Math.round(yPanSize * 0.85);
		this.setLayout(new FlowLayout(1, 15, (int) Math.round((yPanSize - yPanPersSize) / 2)));	//FlowLayout​(int align, int hgap, int vgap)
 
		this.setBackground(Color.GRAY);
 
		for(int i = 0; i < 7; i++) {
			PanPersonalScore psc = new PanPersonalScore(xPanSize, yPanPersSize, i);
			this.add(psc);
		}
	}
}
Joueur :
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
package modeles;
 
public class Joueur{
	//******attributs
	int nbrePts;	//nombre de points de départ pour chaque joueur
	int tour;	//ordre de départ
	String prenom;
 
	//******constructeurs
	public Joueur(int _nbrePts, int _tour, String _prenom){
		this.nbrePts = _nbrePts;
		this.tour = _tour;
		this.prenom = _prenom;
	}
 
	//******Setters Getters
	public void setNbrePts(int _nbrePts){
			this.nbrePts = _nbrePts;
	}
 
	public int getNbrePts(){
		return nbrePts;
	}
 
	public void setTour(int _tour){
		this.tour = _tour;
	}
 
	public int getTour(){
		return tour;
	}
 
	public void setPrenom(String _prenom){
		this.prenom = _prenom;
	}
 
	public String getPrenom(){
		return prenom;
	} 
}
En gros, mon but serait de faire comme ceci dans la classe Control mais que la deuxième métodes soit appelée lorsque l'uitlisateur aura validé le nbreJoueur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
		//affichage question nombre de joueurs
		cadre.initNbreJoueurs();
 
		//Affichage question des prénoms des joueurs
		Cadre.initPrenomsJoueurs();

Merci pour vos retours et critiques constructives !