Problème d'affichage avec un BufferedImage
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:
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....