Encore un thread qui ne fonctionne pas

Résolu/Fermé
papachimique Messages postés 8 Date d'inscription mercredi 4 juillet 2018 Statut Membre Dernière intervention 6 mars 2022 - Modifié le 5 nov. 2021 à 14:45
papachimique Messages postés 8 Date d'inscription mercredi 4 juillet 2018 Statut Membre Dernière intervention 6 mars 2022 - 5 nov. 2021 à 18:18
Bonjour,
Encore une question sur les threads, car j'ai constaté que beaucoup de questions concernent cette question, mais aucune réponse semble fonctionner dans mon cas.
Mon problème se trouve, je pense, sur le joint().

Mon programme consiste à déplacer un panel(transparent) sur un autre panel (en faisant un demi cercle). Malgré mon Thread, seule la position initiale (afficher avant l’appel de la procédure mouveSelection) et la position final apparait mais pas les positions intermédiaires.

Dans ma classe panelOscillo (qui contient une instance maSelect) :
public void mouveSelection()
 {
 for (int i=0;i<=nbPas;i++)
  {
  angle = pasDegrs * (float)i;
  xx = (float) (centreCercleX - rayonX * Math.cos((double)angle));
  yy = (float) (centreCercleY + rayonY * Math.sin((double)angle));
   
   
  Thread thread1 = new Thread(new runMvtMotif((int)xx,(int)yy  ));
  thread1.start();
  try {   thread1.join();  } 
   catch (InterruptedException e) { e.printStackTrace();  }
    
  tempsPause(20);
  }
 }

ma class runMvtMotif
class  runMvtMotif implements Runnable
{
 int xx,yy;
 
 public runMvtMotif(int x,int y) {xx = x;yy=y;}
 
 public void run()
  {
  principal.maFen.monPanAscillo.maSelect.setLocation(xx , yy );
  principal.maFen.monPanAscillo.maSelect.repaint();
  }
}

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
5 nov. 2021 à 14:56
Bonjour,

Le problème vient du fonctionnement de l'EDT (Event Dispatching Thread) qui gère les évènements de l'interface graphique et ne rends pas la main à l'affichage tant que le listener n'est pas terminé (tu peux t'amuser à déplacer toute ta fenêtre, tu verras qu'elle freeze).
Ce qu'il faut c'est avoir un listener extrêmement court, qui démarre un SwingWorker (en gros, un autre thread géré par l'EDT) qui s'exécutera après la fin du listener.
0
papachimique Messages postés 8 Date d'inscription mercredi 4 juillet 2018 Statut Membre Dernière intervention 6 mars 2022
5 nov. 2021 à 18:18
Bonjour KX ... et un grand merci.

tout marche parfaitement. J 'avais fais plein de recherches sur internet mais il me manquait le mot clef SwingWorker.

Du coup je viens aussi de comprendre pourquoi, à chaque fois que je faisais un progressBar, il ne fonctionnait jamais .... pas facile la vie pour les débutants!
0