Bonjour à tous,

Voila, je fais de mon mieux avec mes connaissances Java pour programmer un jeux de cartes multi joueurs en réseau, sur le principe d’un échange client – serveur. Le serveur gère le jeu et centralise les échanges, les clients ne sont que des interfaces avec l’utilisateur.

J’essaie depuis quelques temps de programmer l’affichage côté client, et j’ai de gros problèmes pour rafraîchir la fenêtre lorsque de nouveaux objets (nouvelles cartes, scores…) sont envoyés par le serveur. Je suis complètement perdu avec l’utilisation de la méthode repaint().

Ma fenêtre JFrame comporte un Jpanel lui-même divisé en 2 dans lequel je dessine deux classes qui héritent de Jpanel : GameBoard et ChatBoard.

GameBoard, placé en haut, est le plateau du jeu, la ou sont affichés les cartes et autres infos relatives au jeu. ChatBoard, placée en bas, est simplement composée d’un JTextArea et d’un JTextField pour que les joueurs puissent chatter entre eux.

J’utilise un BorderLayout pour l’affichage dans GameBoard, et je dessine mes cartes dans le panneau SOUTH du BorderLayout. Les cartes du jeu sont des images au format png, chargés sous forme d’ImageIcon, et affichés dans des Jlabels.

Le plus simple est peut être de montrer le code, en simplifié :

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
 
public class ClientFrame extends JFrame implements Observer
{
	private GameClientAble theModel;
	private ChatBoard theChatBoard;
	private GameBoard theGameBoard;
 
 
	public ClientFrame(GameClientAble theModel)
	{
		super();
 
		this.theModel = theModel;		
 
		jp = new JPanel();					
		jp.setLayout(new BorderLayout());
 
		theGameBoard = new GameBoard();
		theChatBoard = new ChatBoard();		
		jp.add(theChatBoard, BorderLayout.SOUTH);
		jp.add(theGameBoard, BorderLayout.CENTER);
 
		this.add(jp);				
 
		this.setContentPane(jp);
 
		this.setVisible(true);
 
		theModel.addAnObserver(this);
	}
 
	// la méthode update est appelée par le modèle lorsq'un nouvel objet arrive
	public void update(Observable obs,Object o)	{
 
		Message message = theModel.getInputMessage(); // je récupère le message sur le modèle
 
		if( (message.getDescription()).equals(Message.CLIENTMESSAGE) || (message.getDescription()).equals(Message.SERVERMESSAGE) ) {
			theChatBoard.update(message);
		}
		else{
			this.repaint();
		}
	}
 
	private class ChatBoard extends JPanel implements ActionListener 
	{		
		private JTextArea ta;
		private JTextField tf;
 
		public ChatBoard()	{
			...
		}
 
		public void update(Message message)	{
			//affiche le message sur le TextArea
		}
 
		public void actionPerformed(ActionEvent e) {
			// informe le modèle qu'un message est pret a être envoyé
			if (e.getSource().equals(tf)) {
				theModel.send(new Message(Message.CLIENTMESSAGE, new ClientMessage(theModel.getMyName(),tf.getText())));
				tf.selectAll();              
			}
		}  
	}
 
	private class GameBoard extends JPanel {
 
		private JLabel label;
		private JPanel clientCardPanel; // le panel sur leque sont dessinés les cartes
 
		public GameBoard() {
			createBoard();			
		}		
 
		public void createBoard() {
 
			this.setLayout(new BorderLayout (10,10));
 
			clientCardPanel = new JPanel(new FlowLayout(FlowLayout.CENTER) ); // le panel sur lequel j'affiche les cartes du joueur
 
			try {
				// theDeck est le tas de carte du joueur à dessiner
				for(int i = 0 ; i != theModel.getTheDeck().size() ; i++) {
 
					// j'extrais la couleur et le numéro de la carte a afficher que j'enregistre dans un String
					String file = theModel.getTheDeck().getCard(i).getSuit() + theModel.getTheDeck().getCard(i).getFace();
 
					clientCardPanel.add(label = createLabel( file ) ); // l'images est chargée et affichée dans un Jlabel
				}
				this.add(clientCardPanel, BorderLayout.SOUTH); // je place le panneau de carte dans le Jpanel
			}
			catch(Exception e) {				
			}  
		}
 
		public void paint() {
			createBoard();
		}
 
		private JLabel createLabel(String icon){
			JLabel label = new JLabel(readImageIcon(icon));
			return label;
		}
 
		private ImageIcon readImageIcon(String filename){
 
			java.net.URL imgURL = GameBoard.class.getResource("images/" + filename + ".png");
 
			if (imgURL != null) {
				return new ImageIcon(imgURL);
			}
			System.err.println("Couldn't find file: " + filename);
			return null;
		}
	}
}
Voila, quand je lance ça, chaque fois qu’un update est appelé par le model, c.a.d qu’un nouveau tas de cartes est à dessiner, rien ne change dans ma fenêtre. Lorsque par contre je redimensionne la fenêtre, je vois apparaître sous le dessin actuel le nouveau dessin avec les nouvelles cartes. Je me doute bien qu’il y à quelque chose qui cloche dans ma façon de redessiner mais je n’arrive pas a trouver comment changer ça.

Merci pour votre aide
Bat