Bonjour,

Je transport des particules (une particule = un pixel et des coordonnées géographiques) à l'écran, que je dessine sur un JPanel à chaque pas de temps de ma simulation :
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
 
public void paintComponent(Graphics g) {
 
    int h = getHeight();
    int w = getWidth();
 
    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHints(hints);
    g2.clearRect(0, 0, w, h);
 
    /** Redessine l'arrière plan si la fenêtre est redimensionnée */
    if (hi != h || wi != w) {
      drawBackground(g2, w, h);
      hi = h;
      wi = w;
    }
    /** Remplis le graphics avec l'arrière plan */
    g2.drawImage(background, 0, 0, this);
 
    /** Dessine mes particules dans le graphics */
    if (population != null) {
      ParticleUI particleUI = new ParticleUI(MainFrame.getValMin(),
          MainFrame.getValMax(), MainFrame.getDisplayColor());
      Iterator<Particle> iter = population.iterator();
      Particle particle;
      while (iter.hasNext()) {
        particle = iter.next();
        if (particle.isLiving()) {
          particleUI.draw(particle, w, h);
          g2.setColor(particleUI.getColor());
          g2.fill(particleUI);
        }
      }
    }
  }
Dans mon code principal, à chaque pas de temps, je lance un monPanelSimulation.repaint()
Pour pouvoir rejouer la simulation à la fin du run, sans refaire les calculs, je fais aussi à chaque pas de temps un getImage() comme suggéré dans la FAQ, pour stocker les étapes sous forme de BufferedImage.

Le problème : entre le repaint() et le paintAll() de getImage(), j'appelle deux fois la méthode paintComponent pour un même pas de temps. Pas de problème quand je transporte 3 particules, plus gênant quand il y en a 50000

Le but : un seul appel à paintComponent() par pas de temps.

Début de solution : créer la BufferedImage qui correspond à mon pas de temps directement dans paintComponent() (plus de méthode getImage() dans le code principal).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
public void paintComponent(Graphics g) {
    /** Le même que précédemment */
    if (population != null) {
        // je dessine mes particles dans le graphics
    }
    /** là il me faudrait un bout de code du genre : */
    BufferedImage step = g2.createImage(w, h);
    listSteps.add(step); // je garde l'image step en mémoire pour la rejouer plus tard
    g2.dispose();
}
Mais cette instruction createImage comme je le voudrais ici n'existe pas. La question a déjà été abordé dans le forum mais je n'y vois pas beaucoup plus clair... peut-être parce que c'est vendredi fin d'après midi...

Merci d'avance si qqn peut m'aider à avancer un peu !
a+

Philippe.