bonjour bonsoir,

J'ai un programme qui permet de faire deplacer un objet sur un panel, jusque la pas de probleme, j'ecris dans une sorte de console les commande a executer et l'objet se deplace

par exemple pour avancer de 50 je vais ecris "av 50" et ca va faire appel a ma fonction avance(), de meme pour reculer je vais faire "re 50" et ca va faire appelle a ma fonction recule(), pour tourner l'objet de 90 degré sur la droite je vais ecris "dr 90".

Mais j'ai voulu animé le deplacement, jsuque la l'objet allais directement a la place qu'on lui donnait. J'ai donc utilisé des Thread car moi on ma appris, animation -> Thread (c ptete pas juste d'ailleur)

Ma classe contenant ces fonction est devenu implement runnable (elle extend Jpanel) et ma fonction avance et reculer devient quelque chose comme ca (en simplifié) :
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
 
private int modifier;
prvate boolean avance, recule;
public synchronized void Avance(int modif) {
t = new Thread(this);	
modifier = modif;
avance=true;
t.start();
avance=false;
}
 
public synchronized void Avance(int modif) {
t = new Thread(this);	
modifier = modif;
recule=true;
t.start();
recule=false;
}
puis le deplacement dans mon run (simplifié)
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
 
public void run() {
//sens de deplacement, si sens = vrai alors on avance, sinon on recule
boolean sens = true;
if (avance) sens=true;
else if (recule) sens=false;
 
if (sens)
for(int i = 1; i < modifier; i++)
{
objetadeplace.x += i;
repaint();
try {t.sleep(100);} 
catch (InterruptedException e) {e.printStackTrace();}	
}
else for(int i = 1; i < modifier; i++)
{
objetadeplace.x -= i;
repaint();
try {t.sleep(100);} 
catch (InterruptedException e) {e.printStackTrace();}	
}
}
bon c'est pas tres propre jsuis d'accord mais bon c'est un peu du bidouillage, donc la qd je fait "av 50" je vois bien mon objet qui se deplace nikel, pareil qd je fait "re 50".
mais si je fait une commande un peu plus complexe "repete 4 [av 50 dr 90]" (en gros ca devrait faire un carré) ben la c l'anarchie ca avance et ca tourne en meme tps, pareil si je fait du recule/avance a la suite.

Moi tout ce que je voudrais c qu'une fois que mon thread qui fait avancer est terminé je puisse passer a l'execution des auutre commande, bloquer ma fonction avance tant que avance ne s'est pas terminer.

Alors je me suis renseigné du coté de join(), et j'ai fait un t.join() apres mon start() mais ca ne change de rien, j'ai lu sur le net qu'on pouvais faire un while(!t.isAlive() {} ben c'est pire, donc si ya une solution miracle ou tout simplement une solution je vous ecoute ^^

Euh sinon comme pour moi mon programme n'avais pas forcement besoin de Thread me suis dit qu'on pouvait ptete faire ca autrement car moi dans le fond tout ce que je veux en gros c un sleep puis un repaint ds une boucle for
mais si je met ca directement dans ma fonction avancer ou reculer ca attend la fin de la boucle puis ca repaint donc aucune animation, sinon je me suis orienté du coté d'un Timer mais j'ai pas vraiment reussi a en tirer quelque chose je suis pas sur que ca soit adapter a la situation.


Bref je galere, et demande de l'aide. En espereant avoir été clair toute facon je reste dans le coin. ^^



Merci d'avance a vous