Bonjour.
J'ai écrit une classe qui permet d'afficher les états successifs d'un tableau de booléens. Une case à vrai est rouge et une case à faux est bleue.
Le tableau évolue au cours du temps :
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
 
package jeudelavie;
 
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.*;
 
public class PanneauGrille extends JPanel {
	private static final long serialVersionUID = 1L;
	private final static int TAILLE_CELLULE = 10;// Taille en pixels d'une
													// cellule
	private BufferedImage image;// Pour stocker le dessin dans un buffer avant
								// affichage
	private Graphics buffer;// Pour dessiner dans le BufferedImage
 
	PanneauGrille(Grille grille) {
		int largeur = grille.getNbColonnes() * TAILLE_CELLULE;
		int hauteur = grille.getNbLignes() * TAILLE_CELLULE;
		// On fixe la taille, la taille minimale et la taille préférée pour
		// s'adapter à toutes les situations de redimensionnement
		this.setSize(new Dimension(largeur, hauteur));
		this.setPreferredSize(new Dimension(largeur, hauteur));
		this.setMinimumSize(new Dimension(largeur, hauteur));
		this.setBackground(Color.white);
		//On crée le BufferedImage
		image = new BufferedImage(largeur, hauteur, BufferedImage.TYPE_INT_ARGB);
		//Pour dessiner sur le BufferedImage
		buffer = image.getGraphics();
		// On affiche l'état initial (itération 0)
		afficheUnEtat(grille);
	}
 
	public void afficheEtatsSuccessifs(Grille gr, int nbIterations) {
		int i = 0;
		// Permet de savoir s'il y a un état stationnaire à la sortie de boucle
		boolean different = true;
		while (different && i < nbIterations) {
			// Calcule l'état suivant en vérifiant s'il est différent du
			// précédent
			different = gr.etatSuivantDifferent();
			// Affiche dans la console l'état actuel
			afficheUnEtat(gr);
			i++;
		}
		if (different)// S'il n'y a pas d'état stationnaire atteint
			System.out.println("Fin.");
		else
			// Si un état stationnaire a été atteint, on affiche l'itération
			// correspondante
			System.out
					.println("Un etat stationnaire a ete atteint a l'iteration numero "
							+ (i - 1) + ".");
	}
 
	public void afficheUnEtat(Grille grille) {
		System.out.println(grille);
		// On parcourt les cellules de la grille
		for (int i = 0; i < grille.getNbLignes(); i++) {
			for (int j = 0; j < grille.getNbColonnes(); j++) {
				if (grille.getEtatCellule(i, j))// Les cases pleines sont en
												// rouge
					buffer.setColor(Color.red);
				else
					buffer.setColor(Color.blue);// Les cases vides sont en bleu
				// On dessine la cellule
				buffer.fillRect(j * TAILLE_CELLULE, i * TAILLE_CELLULE,
						TAILLE_CELLULE, TAILLE_CELLULE);
			}
		}
		repaint();//On affiche à l'écran le contenu du buffer
		// Permet d'attendre 500ms avant de passer à l'état suivant.
		try {
			Thread.sleep(500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
 
	public void paintComponent(Graphics g) {//On affiche à l'écran le contenu du buffer
		super.paintComponent(g);
		g.drawImage(image, 0, 0, this);
	}
}
Quand je construis le panneau PanneauGrille, la grille initiale s'affiche bien.
Mais quand je lance la méthode afficheEtatsSuccessifs (avec un bouton qui est ailleurs), l'affichage n'est pas modifié (pendant plusieurs secondes en fonction du nombre d'itérations) sauf à la fin où il affiche l'état final. La méthode repaint() dans afficheUnEtat(Grille grille) semble ne pas avoir d'effet. Je ne comprends pas pourquoi les états intermédiares ne sont pas affichés. J'y ai déjà passé 2H.
Si quelqu'un pouvait m'aider....