Bonjour,

Je ne sais pas si mon problème est dû vraiment à la manipulation de SWING ou est-ce que c'est de la manipulation pure de JAVA :

J'ai une classe héritant de JPanel (PanScoresNorth). Dans cette classe j'ai créé une fonction "initPanScores(int NbreJoueurs)" (à la ligne 31 de PanScoresNorth) qui doit instancier et ajouter d'autres JPanels (PanPersonalScore) sur le JPanel de cette classe.

Cela ne fonctionne pas alors que si je mets les instanciations dans le constructeur plutôt que dans une fonction cela fonctionne.


Dans PanScoreNorth, j'ai essayé de déclarer la classe psc avant le constructeur et dans la fonction "initPanScores(int NbreJoueurs)" mais aucune des deux manières n'a fonctionné.

Autre problème sûrement lié, j'ai mis dans la fonction une ligne (ligne 35 de PanScoreNorth) colorant le background du panel pour tester : cette ligne fonctionne bien lorsque je suis en débug sur Eclipse, mais en mode RUN, rien ne fonctionne !

Donc voici les classes d'où l'appel à la fonction est fait et les classes héritant de JPanel :

Control :
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
package ctrl;
 
import modeles.Joueur;
import vues.Cadre;
 
public class Control {
 
	Cadre cadre = null;
	Joueur joueur = null;
 
	int nbreJoueurs = 0;
 
	public static void main(String[] args) {
		Control ctrl = new Control();
	}
 
//*********CONSTRUCTEUR***********
	public Control() {
		//affichage de l'interface graphique
		Cadre cadre = new Cadre(this);
 
		//affichage question nombre de joueurs
		nbreJoueurs = cadre.initNbreJoueurs();
 
		do {
		}while(nbreJoueurs == 0);
 
		//instanciations des panneaux de score des joueurs
		cadre.initPanScores(nbreJoueurs);
 
		//affichage question prénoms des joueurs
		cadre.initPrenoms(nbreJoueurs);
	}
 
//*********METHODES***********
	public int getNbreJoueurs() {
		return this.nbreJoueurs;
	}
 
	public void setNbreJoueurs(int nbreJoueurs_) {
		this.nbreJoueurs = nbreJoueurs_;
	}
}
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
43
44
45
46
47
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 int initNbreJoueurs() {
		return panneau.initNbreJoueurs();
	}
 
	public void initPrenoms(int nbreJoueurs_) {
		panneau.initPrenoms(nbreJoueurs_);
	}
 
 
	public void initPanScores(int nbreJoueurs) {
		panneau.initPanScores(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
72
73
74
75
76
77
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;
	PanScores_north scores = null;
 
	//*********CONSTRUCTEUR*********
	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);
 
		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);		
	}
 
	//*********METHODES*********
	public int initNbreJoueurs() {
		return des.initNbreJoueurs();
	}
 
	public void initPrenoms(int nbreJoueurs_) {
		des.initPrenoms(nbreJoueurs_);
	}
 
	public void initPanScores(int nbreJoueurs) {
		scores.initPanScores(nbreJoueurs);
	}
}
PanScoreNorth :
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
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 {
 
	private static final long serialVersionUID = 1L;
	PanPersonalScore psc = null;
	int xPanSize, yPanSize, yPanPersSize;
 
 
	//*********CONSTRUCTEUR*********
	public PanScores_north(int xPanSize_, int yPanSize_) {
		this.xPanSize = xPanSize_;
		this.yPanSize = yPanSize_;
 
		this.setPreferredSize(new Dimension(xPanSize, yPanSize));
 
		//hauteur du panneauPersonnel affiché
		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);
	}
 
	//*********METHODES*********
	public void initPanScores(int nbreJoueurs_) {
		for(int i = 0; i < nbreJoueurs_; i++) {
			psc = new PanPersonalScore(xPanSize, yPanPersSize, i);
			this.add(psc);
			this.setBackground(Color.RED);
		}
	}
}
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
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 {
 
	private static final long serialVersionUID = 1L;
	int xScreenSize, xPanSize, xTextPos, rank;
	int yTextPos = 40;
 
	//*********CONSTRUCTEUR*********
	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_));
	}
 
	//*********METHODES*********
    public void paint(Graphics g) {
        super.paint(g);
        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("JOHN", xTextPos, yTextPos + 20);
        g.setColor(Color.MAGENTA);
        g.drawString("SCORE ", xTextPos, yTextPos + 50);
        g.setColor(Color.GREEN);
        g.drawString("1250", xTextPos, yTextPos + 70);
    }
}

Pour plus de clarté, je donne toutes les autres classes du projet :
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;
	} 
}
PanActualScore_East :
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);
    }
}
PanCommans_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);
	}
}
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
79
80
81
82
83
84
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;
	int nbreJoueurs = 0;
 
	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 int 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));
	//					nbreJoueurs = (int) Integer.parseInt(text);
				}
			}
		});
 
	    return nbreJoueurs;
	}
 
 
	public void initPrenoms(int nbreJoueurs_) {
		//les éléments suivants sont pour essayer
		l1.setText("youpi");
		jtf.setBackground(Color.red);
	}
}
Ce problème me dépasse ... j'ai besoin d'aide.

Merci à vous !