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 :
Dans mon code principal, à chaque pas de temps, je lance un monPanelSimulation.repaint()
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); } } } }
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).
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...
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(); }
Merci d'avance si qqn peut m'aider à avancer un peu !
a+
Philippe.
Partager