Double appel à paintComponent()
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:
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:
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...:aie:
Merci d'avance si qqn peut m'aider à avancer un peu !
a+
Philippe.