Timer ? CA MARCHE PAS §?§

Signaler
Messages postés
79
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
17 novembre 2004
-
Messages postés
25
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
29 janvier 2011
-
piou piou piou ... ... ...
Voilà, je veux utiliser un Timer pour faire défiler à intervalle régulier plusieurs images contenues dans un Vector ... TestAnima est un JPanel qui implemente ActionListener pour capter le moment ou le timer se réveille et changer l'image afficher. le composant JImage est une des classes que g précedemment dévellopé qui s'occupe de charger l'image avec un MediaTracker. les images sont bien chargée, la fenêtre s'ouvre (jusque la pas de prb) et oh surprise le timer refuse de se mettre en route (System.out.println("Event de TestAnima"); ne s'affiche pas une seule fois dans mon ptit dos)... et donc les images ne défilent pas.
par contre je sais que toutes les images sont chargée parceque (accrochez vous...) quand je tripote la fenêtre (je la redimensionne à coup de souris) la l'image change mais sans appeler aucune des méthode actionPerformed (toujours pas de "Event de TestAnima"), il les affiche bien dans l'ordre sauf que de temps en temps (comme ça quand ça lui plait) il en saute une ou deux ...

Si qqun voit ce qui cloche je serais trétra content qu'il me l'explique passke là je suis à bout de neurones. (BoiteCranienneException migraine).

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Image;
import java.awt.Graphics;
import java.awt.Dimension;
import javax.swing.Timer;
import java.util.Vector;

public class TestAnima extends JPanel implements ActionListener
{
Vector scene;
Timer timer;
int currentImage;
Image nextImage;

public TestAnima()
{
setPreferredSize(new Dimension(50,50));

scene=new Vector();

scene.add(new JImage("img\\Bleu.gif").getImage());
scene.add(new JImage("img\\Gris.gif").getImage());
scene.add(new JImage("img\\Marron.gif").getImage());
scene.add(new JImage("img\\Mauve.gif").getImage());
scene.add(new JImage("img\\Noir.gif").getImage());
scene.add(new JImage("img\\Rouge.gif").getImage());
scene.add(new JImage("img\\Vert.gif").getImage());

Timer timer=new Timer(100,this);
timer.start();

}

public void actionPerformed(ActionEvent e)
{
if(e.getSource()==timer)
{
repaint();
System.out.println("Event de TestAnima");
}
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawImage(getNextImage(),0,0,this);
}

private Image getNextImage()
{
currentImage++;
if (currentImage==scene.size()) currentImage=0;
System.out.println(currentImage);
return((Image)scene.elementAt(currentImage));
}

}

class BidFrame extends JFrame implements ActionListener
{
public BidFrame(){getContentPane().add(new TestAnima());}
public void actionPerformed(ActionEvent e){System.out.println("Event de BidFrame");}

public static void main(String argmts[])
{
BidFrame frame=new BidFrame();
frame.pack();
frame.setVisible(true);
frame.setLocationRelativeTo(null);
}
}

Oobaï TaPou !

10 réponses

Messages postés
649
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
9 septembre 2004
7
j'utilise le tiimer plutot sous la forme

Timer timer=new Timer();
timer.scheduleAtFixedRate(task,delay,period);
Messages postés
79
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
17 novembre 2004
1
... oui mais c'est le Timer de Util ça ... faut que j'utilise le Timer Swing

Oobaï TaPou !
Messages postés
649
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
9 septembre 2004
7
En virant le e.getSource()==timer
Messages postés
79
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
17 novembre 2004
1
Ben, si je fais ça comment je fais pour savoir que c le timer qui a créé l'event ? pour l'instant c'est un test mais par la suite j'aurais plusieurs Event à contrôler dans mon actionperformed ...

Oobaï TaPou !
Messages postés
649
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
9 septembre 2004
7
sinon utilise

Timer timer=new Timer(100,new ActionListener(){
public void actionPerformed(ActionEvent e){
time();
}
});

public time(){
posImage++;
repaint();
}
Messages postés
79
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
17 novembre 2004
1
cool ça marche... marci
Mais comment ça se fait que ça marchais pas comme je l'ai fait, j'ai beau tout retourner dans ma tête mais logiquement ça doit marcher aussi avec ce que j'ai fait ... là je vois que l'on recréer en direct un actionlistener mais pourquoi ça ne veut pas marcher si c'est le JPanel le ActionListener, ma méthode ActionPerformed n'est pas bien définie ?

JE VEUX COMPRENDRE !

Oobaï TaPou !
Messages postés
649
Date d'inscription
mardi 8 juin 2004
Statut
Membre
Dernière intervention
9 septembre 2004
7
quelquefois il vaut mieux ne pas comprendre :)
Messages postés
79
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
17 novembre 2004
1
Ben visiblement c'est la condition if(e.getSource()==timer)
qui sort false, et si je pige pas pourquoi cette condition ne me sort pas true, c'est que je suis incapable d'employer les ActionEvent... Perspective assez handicapante en java ...
J'ai beau chercher et recherche dans les sources et sur le tutorial de sun , je vois pas par quelle autre méthode il faut que j'identifie l'event de timer ...
Si je trouve pas je vais finir par ne plus dormir...
Oobaï TaPou !
Messages postés
1
Date d'inscription
jeudi 25 août 2005
Statut
Membre
Dernière intervention
22 décembre 2005

Bonjour,

La variable timer était déclarée 2 fois (une fois dans la classe, une fois en local). Etait-ce voulu ?
Messages postés
25
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
29 janvier 2011

Je pense qu'il faut que tu cast la variable ressortie par ton e.getSource().
et pis il faut que tu utilise la fonction equals plutot que le ==. je crois que le == ne fonctionne qu'avec les int, float, boolean etc, mais pas avec les objet.


je sais pas si je suis bien clair..... essaye quelque chose comme ca:


public void actionPerformed(ActionEvent e)
{
   try
   {
      if(((Timer)(e.getSource())).equals(timer))
      {
         repaint();
         System.out.println("Event de TestAnima");
      }
   }
}

--==IvanTil==--