méthode qui tourne en boucle en dehors de l'EDT, d'où ton problème de clignotement.
Version imprimable
méthode qui tourne en boucle en dehors de l'EDT, d'où ton problème de clignotement.
Mais tu as jeté un coup d'oeil au moins à AbsoluteImagePanel : je n'ai pas de méthode a qui tu passes des panels et qui te fabriquent des panels que tu ajoutes ensuite au panel que tu as précédemment passé en paramètre à la méthode fabrication. Si tu appelles ça simple !
C'est ce qu'on t'a dit de faire, oui...
Dans ton code, par contre :
On voit que tu ajoutes labImgObstacle et que tu l'enlèves juste après : ça me semble logique que si on l'ajoute puis on l'enlève, qu'il soit à un moment, puis qu'il n'y soit plus au final. En plus, je ne sais pas ce que fait fctFond, mais si le but est de passer le fond au dessus de l'avion, donc d'afficher le ciel au dessus de l'avion, juste pour qu'on ne voit jamais l'avion, c'est bien ce qu'il faut faire, cependant ce n'est pas utile, puisque tu l'enlèves juste après l'avion.Code:
1
2
3
4
5 panPrincipale.add(labImgObstacle); panPrincipale.setComponentZOrder(labImgObstacle, 0); principale.fctFond(panPrincipale); panPrincipale.remove(labImgObstacle);
Pourquoi ne reprends tu pas simplement mon code ?
1-
Dsl à tt le monde j'ai Edit mon dernier message ... je ne savais pas que vs l'aviez lu :(
2-
Je me ss rendu compte d'un probléme.
Donc voila j'essaye en utilisant "remove" pour effacer le dessin que je vien de dessiner.Mais j'ai toujours cette trainée derrière l'avion pk?
Voici mon code:
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
36
37
38
39
40
41
42
43
44
45
46 //Image Obstacle private Image imgObstacle =new Image("C:\\Users\\antoine\\Desktop\\imgProjetObstacle.JPG"); private JLabel labImgObst =null;private JLabel labImgObstTmp =null;//Obs=obstacle private int i=0;//pour que le tirage au sort ne se fasse qu'une fois public int[] fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) { if(i==0){//position de depart de l'img int posXDepart=fctHasard(0,fenPrincipale.getWidth()); int posYDepart=82; posX=posXDepart;posY=posYDepart; i++; } labImgObst=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,50, 82); panPrincipale.add(labImgObst); panPrincipale.setComponentZOrder(labImgObst, 0); int tabPos[]=new int [2]; tabPos[0]=posX;tabPos[1]=posY; return tabPos; } //Mouvement Obstacle public void fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale) { int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo); posXo=tabPos[0];posYo=tabPos[1]; int continuer = 0;//boolean continuer=true; System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+" -PosXo="+posXo+" posYo="+posYo);//controle posYo++; System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle if(posYo==fenPrincipale.getHeight()){ System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle posYo=82; posXo=fctHasard(0,fenPrincipale.getWidth()); } fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo); panPrincipale.remove(labImgObst); } public void fctMouvement1(JFrame fenPrincipale, JPanel panPrincipale){ int delay = -100; new Timer(delay, e-> this.fctMouvement(e, fenPrincipale, panPrincipale)).start(); }
3-
Je n'ai jamais voulu faire ça.Il n'y a qu'un seul panel sur lequel on place plusieurs JLabel.C'est ça le principe.Citation:
je n'ai pas de méthode a qui tu passes des panels et qui te fabriquent des panels que tu ajoutes ensuite au panel que tu as précédemment passé en paramètre à la méthode fabrication. Si tu appelles ça simple !
@Tchize//
Oui tu as raison à force on ne voit presque plus l'image car elle apparait 1/100second et plus le programme avance plus c'est pire...
Au lieu de :
Fait :Code:
1
2 fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo); panPrincipale.remove(labImgObst);
Ce que j'ai déjà dit !Code:
1
2
3
4 if ( labImgObst!=null ) { panPrincipale.remove(labImgObst); } fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo);
Je ne vois pas pourquoi le code exécuté par le Timer Swing s'exécuterait en dehors de l'EDT :koi:
Mon code qui laisse une trainée....(l'avion avance)
PS:si il y a qq chose de pas claire dans ma logique je peux l'expliquer.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
36
37 public int[] fctDessinerObstacle(JFrame fenPrincipale, JPanel panPrincipale,int posX,int posY) { if(i==0){//position de depart de l'img int posXDepart=fctHasard(0,fenPrincipale.getWidth()); int posYDepart=82; posX=posXDepart;posY=posYDepart; i++; } labImgObst=imgObstacle.fctAfficherImg(panPrincipale, posX,posY,50, 82); panPrincipale.add(labImgObst); panPrincipale.setComponentZOrder(labImgObst, 0); int tabPos[]=new int [2]; tabPos[0]=posX;tabPos[1]=posY; return tabPos; } //Mouvement Obstacle public void fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale) { int tabPos []=fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo); posXo=tabPos[0];posYo=tabPos[1]; int continuer = 0;//boolean continuer=true; System.out.println("indice tabPos[0]:"+tabPos[0]+" ,tabPos[1]:"+tabPos[1]+" -PosXo="+posXo+" posYo="+posYo);//controle posYo++; System.out.println("-coordonnees X:"+posXo+" ,y:"+posYo + " -Compteur="+continuer);//controle if(posYo==fenPrincipale.getHeight()){ System.out.println("**************ALERTE! posYo=Hauteur du Label qui le limite**************");//controle posYo=82; posXo=fctHasard(0,fenPrincipale.getWidth()); } if ( labImgObst!=null ) { panPrincipale.remove(labImgObst); } fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo); }
Ta méthode fctMouvement(ActionEvent e ,JFrame fenPrincipale, JPanel panPrincipale) appelle 2 fois fctDessinerObstacle(fenPrincipale, panPrincipale, posXo, posYo) (qui fait l'ajout du panel), donc il faut faire le truc qui supprime pour les 2... par contre, oui, j'aimerais savoir pourquoi l'appeler 2 fois à chaque action du timer ? Parce que ta méthode sert à la fois à positionner et à ajouter le panel : donc à chaque action :
- tu l'appelles : la première fois (i==0) ça initialise les coordonnées, puis ça AJOUTE un nouveau panel à un container
- tu incrémentes une coordonnée pour que ça bouge
- tu enlèves (enfin) le dernier panel ajouté
- tu la rappelles la méthode, donc ça AJOUTE un nouveau panel à un container
Résultat à chaque action : 1 panel reste. Donc à la deuxième action : 2 panels restent. A la troisième : 3 d'où traînée.
Pourquoi ne pas faire l'initialisation au début, genre avant de démarrer le timer par exemple ! Ce que je fais d'ailleurs dans AbsoluteImagePanel :roll: Je n'ai pas besoin d'explications sur ta logique : je dis simplement que si elle était plus simple, tu n'aurais pas tous ces problèmes.