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 :

Problème entre Timer et MouseAdapter


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Par défaut Problème entre Timer et MouseAdapter
    Bonjour, mon programme est un logiciel de Tower Defense qui nécessite un bouton pour lancer une vague de monstre. Cette vague de monstre est géré par un javax.swing.timer qui fait avancer les monstre toutes les 100 millisecondes. Je possède une fonction lancerVague(int i) dans ma classe TDGraphic qui lance la vague numero i. Ce programme marche parfaitement lorsque je lance en brut la fonction lancerVague(0) depuis mon TDGraphic dans le main.

    Malheuresement, lorsque j'essaye de lancer par un MouseAdapter (lorsque la souris cliquera) le lancerVague(0) cela ne marche plus.

    Pour le code je l'ai simplifié pour la compréhension du problème mais je précise que je l'ai testé simplifier il ne marche pas non plus.

    dans le class TDGraphic (tdG)
    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
    public void lancerVague(int i){
    		System.out.println("TEST2");
    		td.lancerVague(i);
    	}
    class EcouteurSouris extends MouseAdapter{
    		private TDGraphic tdG;
    		private boolean etatVague=false;
     
    		public EcouteurSouris(TDGraphic t){
    			tdG=t;
    		}
                    public void mouseClicked(MouseEvent e){
    			//Permet de lancer une vague si clique sur le bouton Lancer Vague (BoutLV)
     
    			System.out.println("TEST");
    			tdG.lancerVague(0);
    			System.out.println("TESTFin");
     
    		}
    }
    dans le class TowerDefense (td)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void lancerVague(int i){
    		System.out.println("TEST3");
                    myVague[i].lancerVague();
    	        System.out.println("TEST15");
    }
    dans le class Vague (myVague)
    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
    public Vague(TowerDefense td){
                 timer=new Timer(100,new EcouteurTimer(this));
      }
     
    public void lancerVague(){
    	  System.out.println("TEST4");
    	  timer.start();
    	  System.out.println("TEST5");
    	  while (timer.isRunning()){}
     }
     
    class EcouteurTimer implements ActionListener{
    	  private Vague vague;
     
    	  public EcouteurTimer(Vague v){
    		  vague=v;
    	  }
     
    	  public void actionPerformed(ActionEvent event){
    		  System.out.println("TEST6");
              }
      }
    Le programme devrait normalement afficher (ce qu'il fait en ligne de commande brut) :
    - Test
    - Test2
    - Test3
    - Test4
    - Test5
    - Test6
    - Test6
    ... et TEST6 jusqu’à arriver à la fin du compteur

    Quand je test le programme s’arrête à TEST5. Je ne comprend donc pas pourquoi les impulsion du timer ne fonctionne pas.

    Merci d'avoir lu mon problème (peu être un peu long mais je préfère bien l'expliquer) et si vous remarquer une erreur ou mieux la source de mon problème je suis tout à votre écouter.

  2. #2
    Membre émérite

    Profil pro
    Technicien
    Inscrit en
    Février 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2009
    Messages : 338
    Par défaut
    Bonsoir,

    Un peu difficile de suivre car il semble qu'il y ait différentes choses qui ne marchent pas ou plus.

    2 pistes qui pourront peut-être t'aider :
    1. Après avoir instancié l'objet timer, un timer.start() provoquera peut être les impulsions attendues ;
    2. Le code "while (timer.isRunning())" n'est peut être pas une bonne pratique. Ca risque de figer ton IHM. Tu trouveras sûrement des informations ici http://gfx.developpez.com/tutoriel/j...ing-threading/ pour gérer ça autrement.


    Benoit

  3. #3
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Il est même sûr que ce while est la raison du problème. Cette boucle infinie bloque l'EDT, Thread responsable du dessin et de déroulement des events Swing, or ton timer émet des events qui ne pourront pas être dépilées de l'EventQueue par l'EDT, puisque celui ci est bloqué par ton while...

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Par défaut
    Je vous remercie pour votre réponse. J'ai verifié c'est bien la boucle while qui bloqué le Thread. je n'ai pas encore trouver de solution pour remplacer la boucle mais je pense pas que ce soit trop compliqué.

Discussions similaires

  1. problème entre IE et Mozilla firefox
    Par bilb0t dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/06/2005, 17h07
  2. Problème entre Delphi7 et Crystal Report 9
    Par claude dans le forum Bases de données
    Réponses: 5
    Dernier message: 25/11/2004, 16h42
  3. Problème entre IB 6.0 et Access 2000
    Par Polux63 dans le forum InterBase
    Réponses: 3
    Dernier message: 19/04/2004, 10h34
  4. Problème entre Dev-c++ et Borland c++ compiler 5.5
    Par Argonz dans le forum Dev-C++
    Réponses: 6
    Dernier message: 21/10/2003, 16h21
  5. [ODBC] Problème entre access et ODBC
    Par StephCal dans le forum Access
    Réponses: 4
    Dernier message: 09/07/2003, 16h47

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