Bonjour,

Je travaille sur un modèle de simulation numérique, avec des calculs d'un côté et un affichage à l'écran de la simulation de l'autre. J'utilise pour cela un SwingWorker().
J'ai deux objets :
* Simulation() qui execute les calculs
* SimulationUI() qui dérive d'un JPanel sur lequel je dessine les étapes de la simulation, en redéfinissant paintComponent()

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
 
class MonSwingWorker extends SwingWorker {
       @Override
       public Object doInBackground() throws Exception {
           while(time < simulationDuration) {
              simulation.step(time); //je lance une étape
              publish(time);
           }
       }
 
       @Override
       protected void process(List<Long>times) {
          for (long time:times)
             if (time % dt_refresh == 0) {
                slider.setValue(step++); // je fais avancer un slider
                simulationUI.repaint(); //je rafraichis l'affichage 
             }
       }
   }
Le problème : ça marche sans aucun problème mais le code appelle deux fois la méthode simulationUI.paintComponent() ...
Le premier est sûrement dû à l'utilisation de la méthode publish() (qui ajoute une nouvelle tache dans l'EDT, je le dis mal mais c'est l'idée, non ?) et l'autre qui correspond à mon repaint()

J'ai refais tourner en supprimant la ligne simulationUI.repaint().La méthode paintComponent() est appelée une fois, mais je n'observe plus de rafraichissment à l'écran ...

Bref je comprends pas bien ce qui se passe

J'ai dis que le code marchait bien et que je pourrais m'en tenir là. Mais un double appel à la méthode paintComponent() est très gênant parce que je fais beaucoup de calculs dedans et ça ralentit l'application.

D'avance merci pour vos éclaircissments.
Philippe.