IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDT/SwingWorker Java Discussion :

[Thread] Probleme avec mon Timer


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 33
    Points : 22
    Points
    22
    Par défaut [Thread] Probleme avec mon Timer
    Bonjour a vous,

    Voila mon nouveau probleme. J'ai cree un Timer pour faire un refresh de ma fenetre. Voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SwingUtilities.invokeLater(
            new Runnable() {
          public void run() {
            new Timer(20000, raffraichir).start();
          }
        }
        );
    Helas meme qd j'ai ma fenetre qui est fermee apres l'avoir ouverte le Timer continue de tourner Et donc je suis bloque.

    Y aurait il pas un moyen de fermer mon Timer au moment de la fermeture de ma fenetre ???

    Merci d'avance


    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 44
    Points : 52
    Points
    52
    Par défaut
    Bonjour,

    C'est possible en effet, voici pour le principe:

    Tu ajoutes un écouteur à ta fenêtre (WindowListener) et au moment où ta fenêtre se ferme (windowClosed) tu arretes ton timer.
    Dans ce cas la déclaration anonyme de ton timer n'est pas possible, il te faut une référence à celui-ci dans ta classe fenêtre.

    Bon courage.

    Ben

  3. #3
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut
    Le problème avec ta classe anonyme, c'est que tu n'as pas de lien vers ton Timer et donc que tu ne peux pas appeller la methode stop() à la fermeture de la fenêtre...

    Pourquoi ne pas déclarer ton Timer en dehors de l'appel de méthode de manière à définir que ON_WINDOW_CLOSED, tu appelles timer.stop() ? (je sais pas si c'est super clair...)

    Ah ben voilà, benohite m'a devancé de quelques minutes

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Merci Ben,

    Mais le probleme c'est que je n'arrive pas a faire Timer.stop(); !!!
    Et je ne vois pas comment faire

    Je suis dans le flou total la

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Cold Hand
    Le problème avec ta classe anonyme, c'est que tu n'as pas de lien vers ton Timer et donc que tu ne peux pas appeller la methode stop() à la fermeture de la fenêtre...

    Pourquoi ne pas déclarer ton Timer en dehors de l'appel de méthode de manière à définir que ON_WINDOW_CLOSED, tu appelles timer.stop() ? (je sais pas si c'est super clair...)

    Ah ben voilà, benohite m'a devancé de quelques minutes

    voila tout a fait je ne peux me servir de la fonction stop() !!!
    et pour te dire la verite je ne t'ai pas bien suivi
    Tu pourrais reprendre ?

    Merci

  6. #6
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut
    Comme ça, à brûle pour point, j'ai une idée assez simple... Tu crées la classe MyTimer qui extends Timer et implements Runnable. Tu implémentes run() comme tu l'as fait et ton code devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyTimer timer = new MyTimer(); 
    SwingUtilities.invokeLater(timer);
    quand tu fermes la fenêtre, tu appelles timer.stop();

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 44
    Points : 52
    Points
    52
    Par défaut
    On appelle déclaration anonyme, le fait de creer un objet sans lui donner de nom (logique non ).
    Dans ton code :Il t'es donc difficile d'appeller la methode stop sur celui-ci vu qu'il n'a pas de nom. Il te faut donc faire quelquechose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Timer t;
    .....
    t = new Timer(20000,rafraichir);
    t.start();
    .....
    .....
    t.stop();
    J'espère que c'est un peu plus clair

    Ben

  8. #8
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Points : 118
    Points
    118
    Par défaut
    @benohite : Justement, je pense que s'il se complique autant la tâche c'est pour pouvoir passer un Runnable à invokeLater...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 44
    Points : 52
    Points
    52
    Par défaut
    j'ai peu être compris de travers mais pour moi ca ne change rien. Il suffit juste de declarer le timer au lieu de le creer anonymement.

    Ben

  10. #10
    Membre à l'essai
    Inscrit en
    Novembre 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par benohite
    On appelle déclaration anonyme, le fait de creer un objet sans lui donner de nom (logique non ).
    Dans ton code :Il t'es donc difficile d'appeller la methode stop sur celui-ci vu qu'il n'a pas de nom. Il te faut donc faire quelquechose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Timer t;
    .....
    t = new Timer(20000,rafraichir);
    t.start();
    .....
    .....
    t.stop();
    J'espère que c'est un peu plus clair

    Ben
    Ben j'ai essaye comme tu me dis mais helas qd j'appele
    sur mon bouton "fermer", j'ai une erreur d'execution et la fenetre ne se ferme plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
          at  ........ ligne ou j'ai le t.stop();
    Je ne comprends pas ce probleme

    Merci

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 44
    Points : 52
    Points
    52
    Par défaut
    Là je pense que ca vient de la façon dont tu appelles le timer cad la methode SwingUtilities.invokeLater.

    Un petit coup d'oeil dans la doc :
    Causes doRun.run() to be executed asynchronously on the AWT event dispatching thread. This will happen after all pending AWT events have been processed. This method should be used when an application thread needs to update the GUI. In the following example the invokeLater call queues the Runnable object doHelloWorld on the event dispatching thread and then prints a message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Runnable doHelloWorld = new Runnable() {
         public void run() {
             System.out.println("Hello World on " + Thread.currentThread());}};
     SwingUtilities.invokeLater(doHelloWorld);
     System.out.println("This might well be displayed before the other message.");
    If invokeLater is called from the event dispatching thread -- for example, from a JButton's ActionListener -- the doRun.run() will still be deferred until all pending events have been processed. Note that if the doRun.run() throws an uncaught exception the event dispatching thread will unwind (not the current thread).
    En résumé, ton timer ne sera pas créer et démarrer tant qu'il y aura des évènements, ce qui justifie le NullException à mon avis.
    Tu devrais peut être essayer de faire plus simple et de te passer de la méthode invokeLater ou alors tu crées d'abord ton timer et tu ne mets dans la methode invokeLater que:Ben

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme avec mon timer
    Par cosmoff dans le forum MPLAB
    Réponses: 0
    Dernier message: 30/06/2014, 18h52
  2. Probleme avec mon thread
    Par croc14 dans le forum EDT/SwingWorker
    Réponses: 8
    Dernier message: 23/07/2007, 15h22
  3. problem avec un timer
    Par ridouani dans le forum C++
    Réponses: 5
    Dernier message: 20/09/2005, 17h43
  4. Probleme avec mon professeur
    Par Hamza dans le forum Algorithmes et structures de données
    Réponses: 20
    Dernier message: 16/07/2005, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo