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 :

Timer s'executant 2 fois simultanément


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut Timer s'executant 2 fois simultanément
    Bonjour,

    J'ai ce code très simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ActionListener taskPerformer = new ActionListener() {
     
    			public void actionPerformed(ActionEvent evt) {
    				JOptionPane.showMessageDialog(null, "alerte");
    		      }
    		  };
    		  Timer temp = new Timer(2000, taskPerformer);
    		  temp.start();
    Et ce que je ne comprend pas c'est pourquoi le timer ne s'execute pas correctement. En effet, quand je lance cela j'ai 2 messages d'erreur qui s'affiche l'un derrière l'autre puis 2 secondes plus tard 2 autres s'affichant ensemble et ainsi de suite.

    Or moi j'ai besoin que l'action s'execute une fois, pas en double

  2. #2
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    salut.
    c'est quoi l'erreur que tu obtiens ?
    et si tu veux connaitre la trace de l'exécution, utilise un System.out.println(....) plutôt qu'un JOptionPane

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Il n'y a aucune erreur, le problème n'est pas que le programme bug mais qu'il ne s'execute pas correctement. Je n'ai mis que le JOptionPane pour montrer que cela ne fonctionnait pas et que l'action du timer s'executait 2 fois toutes les 2 secondes au lieu d'une toute les 2 secondes

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Alors, l'erreur avec ton code, ce n'est pas que le message s'affiche 2 fois au lieu de 1, mais plutôt qu'il ne s'affiche QUE 2 fois, et non pas à l'infini !

    Une fois que tu fais start sur ton Timer, il va exécuter l'actionPerformed() en boucle jusqu'à ce que tu fasses un stop.

    Dans ton cas, je suppose qu'il s'arrête à 2 car ton programme se termine.

    Ajoute une JFrame que tu laisses ouverte afin que ton programme ne se termine pas, et tu auras ton message toutes les 2 secondes non stop.

    Si tu veux que le traitement ne se fasse qu'une fois, met un stop à la fin de ton actionPerformed sur ton timer, ou alors utilise les Thread (car je pense que c'est plutôt cela que tu essaies de faire).

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Décidement, j'ai fait un Thread mais j'ai toujours le même problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Clignote extends Thread
    {
    	public void run()
    	{
    		JOptionPane.showMessageDialog(null, "alerte");
     
      		  try {
      	        // pause
      	        Thread.sleep(2000);
      	        Fenêtre.clignoter();
      	      }
      	      catch (InterruptedException ex) {}
    	}
    }
    Dans Fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	static public void clignoter()
    	{
    		Thread clignement=new Clignote();
    		clignement.start();
    	}

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Alors c'est tout à fait normal !
    Tu lances ton thread qui se relance lui même puis qui se relance, qui se relance, ... ZZzZz...

    J'avais compris que tu voulais faire exécuter une tâches 1 fois, mais en dehors du Thread actif. Par contre, je vois que tu as une méthode clignoter(), du coup j'ai un doute.

    Tu cherches à faire quoi ? Car je me demande si j'avais bien compris la première fois.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    En une phrase : je veux qu'une (et une seule) boite de message apparaisse une fois toute les 2 secondes.

    Que dois-je mettre pour faire cela ?

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Ah !! alors en effet, je n'avais rien compris.

    Le moyen le plus simple c'est d'avoir une fenêtre statique je pense.
    Tu peux utiliser le design pattern singleton.

    Et ensuite tu joues avec un simple setVisible() afin d'afficher ou de masquer la fenêtre.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Voilà un petit exemple :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.Timer;
     
     
    @SuppressWarnings("serial")
    public class Test2 extends JFrame {	
    	private static JFrame instance = null;
     
    	private Test2() {
    		setTitle("Avertissement");
    		add(new JLabel("Avertissement !!"));
    		setSize(200, 200);
    	}
     
    	public static Test2 getInstance(){
    		if(instance==null)instance = new Test2();
    		return instance;
    	}
     
    	public static void main(String[] args) {
    		JFrame frame = new JFrame();
    		JButton bouton = new JButton("Start");
     
    		bouton.addActionListener(new ActionListener() {	
    			public void actionPerformed(ActionEvent e) {
    				new Timer(2000, new ActionListener() {
    					public void actionPerformed(ActionEvent e) {
    						Test2.getInstance().setVisible(true);
    					}
    				}).start();				
    			}
    		});
     
    		frame.add(bouton);
    		frame.pack();
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setVisible(true);
     
     
    	}
    }
    Comme cela, tu as un appel setVisible(true) qui s'effectue toujours sur la même instance.
    Si elle est déjà ouverte, ca n'en ouvre pas d'autre.
    Si elle est masquée, elle est réaffichée.

    Je pense que cela correspond à ce que tu recherches.

  10. #10
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Citation Envoyé par Ceubex Voir le message
    En une phrase : je veux qu'une (et une seule) boite de message apparaisse une fois toute les 2 secondes.

    Que dois-je mettre pour faire cela ?
    salut.
    ton code est correcte mais apparemment tu appui pas sur le bouton OK de ton JOptionPane.
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.Timer;
     
     
    public class Fen extends JFrame {
     
        /**
         * author slim_java
         */
     
         int i  =0;
         JDialog boîte = new JDialog();
     
        public static void main(String args[]) {
            try {
                Fen frame = new Fen();
                frame.setVisible(true);
     
     
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
     
        public Fen() {
            super();
            setBounds(100, 100, 500, 375);
            boîte.setBounds(this.getX()+50, this.getY()+50, 300, 200);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     
            ActionListener taskPerformer = new ActionListener() {
     
                public void actionPerformed(ActionEvent evt) 
                {
                     i++;  
                     boîte.setVisible(true);
                     boîte.setTitle("boite de dialogue num : -- "+i+" --");                 
                     boîte.setVisible(false);             
                 }
              };
              Timer temp = new Timer(2000, taskPerformer);
              temp.start();
        }
     
    }

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Ok bon alors mauvaise nouvelle, toutes vos solutions marchent quand je crée un projet pour les y mettre mais lorsque je les mets dans mon projet sous la même forme, ca le fait à chaque fois en double

    Le problème ne viens pas du fait que je clique ou non sur OK, que je le fasse ou pas le problème survient, ou même si je fais toute autre action à la place de la boite de message, elle se fait en double.

    Apparemment, il y a quelque chose dans la configuration de mon projet qui provoque ce double appel car ça le fait avec tous les codes. Mais je ne vois vraiment pas ce que cela pourrait être

  12. #12
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Par défaut
    Tu n'appelerais pas deux fois la methode clignoter() par hazard ??

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 676
    Par défaut
    Non il ne s'agit pas de ça, j'ai mis dans mon projet le code de slim_java et ça double l'appel, tandis que dans un nouveau projet ça se passe bien

  14. #14
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Fais voir ton main...

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Dans un cas comme celui-ci, à mon avis, le mieux est encore de faire un debug, tu peux ainsi suivre l'exécution de ton code, et localiser ton problème.

Discussions similaires

  1. [C++]Timer pour exécution séparée
    Par Invité4 dans le forum SDL
    Réponses: 33
    Dernier message: 26/02/2008, 18h01
  2. [DOS] Execution de fichier simultané avec nom aléatoire
    Par noabeuh dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 04/03/2007, 14h47
  3. Réponses: 1
    Dernier message: 03/12/2006, 16h13
  4. [VBA-W] Executer plusieurs fois la même procédure
    Par delamarque dans le forum VBA Word
    Réponses: 3
    Dernier message: 05/12/2005, 13h39
  5. code qui s'execute plusieurs fois
    Par khelif dans le forum JBuilder
    Réponses: 1
    Dernier message: 10/03/2005, 21h56

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