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

2D Java Discussion :

Evènement MouseClicked déclenché plusieurs fois pour un seul click ?!?


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut Evènement MouseClicked déclenché plusieurs fois pour un seul click ?!?
    Bonjour,

    je viens ici vous soumettre mon problème car je le trouve vraiment pas banale. Je dois développer un logiciel de dessin en svg à la manière d'inkscape.
    Je ne vais évoquer que la partie de mon logiciel qui me pose problème.

    Pour avoir une zone de dessin j'ai créé une classe panel qui hérite de JPanel. J'ai aussi crée une classe abstraite Figure qui hérite de JComponent. Ainsi, lorsque je veux créer une figure «*concrète*» un rectangle par exemple, je fais hériter mon rectangle de la classe Figure, je redéfini les méthodes que j'ai besoin et enfin, je l'ajoute à mon panel.
    Tout fonctionne très bien, jusqu'a ce que je décide de récupérer les évènements de la souris associé aux figures de mon panel.
    Pour ce faire, au moment de l'ajout de la figure à mon panel je l'ajoute aussi à un mouseListener.
    Mais, lorsque je clique une fois sur la figure dans mon panel il y au moins 6 évènements mouseClicked de déclenché ...

    Une partie de la classe Figure

    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
    public abstract class FigureWidget extends JComponent
    {
    	// liste d'attributs d'une figure
    	private String id;
    	private Point origine;
    	private Point dessin;
    	private int width = 1;
    	private int height = 1;
    	private int epaisseurContour = 1;
    	private Color couleurContour = new Color(0, 0, 0);
    	private Color couleurInterieur = new Color(155, 155, 255);
    	private boolean isSelected = false;
    	private String nom;
    	protected final int constTimeResize = 10;
    	protected int testTimeResize = constTimeResize;
     
    	public abstract void paintComponent(Graphics g);
    }

    Voici une partie du code de la classe panel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class JPanelEditableZone extends JPanel
    {
    	/* méthode que j'utilise pour ajouter une figure à mon panel */
    	public void addWidget()
    	{
    		// figureTmp est une variable de classe de type Figure 
    		figureTmp.addMouseMotionListener(listenerWidget);
    		figureTmp.addMouseListener(listenerWidget);
     
    		super.add(figureTmp);
    	}
    }
    Mon listener

    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
    public class ListenerWidget implements MouseListener, MouseMotionListener
    {
    	private Controleur controleur;
     
    	public ListenerWidget(final Controleur controleur)
    	{
    		this.controleur = controleur;
    	}
     
    	public void mousePressed(MouseEvent event)
    	{}
    	public void mouseReleased(MouseEvent event)
    	{}
     
    	public void mouseClicked(MouseEvent event)	
    	{
    		// cette méthode est apellée plusieurs fois lors d'un clique sur une figure
    		System.out.println("mouse clicked");
    	}
     
    	public void mouseEntered(MouseEvent event)
    	{}
     
    	public void mouseExited(MouseEvent event)
    	{}
     
    	public void mouseDragged(MouseEvent event)
    	{}
     
    	public void mouseMoved(MouseEvent event)
    	{}
    }
    Pour information, j'ai le même problème pour toutes les méthodes du listener. A chaque évènements le méthode correspondante est appelée plusieurs fois. Vous imaginez bien que ce problème est assez gênant.
    Si vous aviez des idées d'où viens le problème ça m'aiderai beaucoup.

    Merci.

  2. #2
    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
    Le concept un JComponent par forme, tu peux oublier tout de suite, c'est voué à l'échec. Ce sera une galère sans nom avec les layouts pour un résultat foireux dans l'ensemble.

    La façon de faire est de créer un unique composant qui a pour rôle de dessiner toutes tes formes. Pour dessiner tes formes il faudra étendre la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    protected void paintComponent(Graphics g)
    .

    Je te renvoie vers un autre sujet ou j'ai posté un exemple de ce genre de choses: http://www.developpez.net/forums/d91...e/#post5165799

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 92
    Par défaut
    Ah, je ne savais pas. Merci, je vais regarder ton exemple et modifier mon code en conséquence.

    Pour ce qui est de mon problème d'origine, je pense avoir trouvé une solution.
    Pour ajouter une figure à mon panel, je fais un "drag" sur le panel. La figure est crée en fonction de la taille du drag. Comme dans inkscape.
    Or, à chaque apelle de la méthode mouseDragged (de mon listener) j'apelle la méthode addWidget de la classe JPanelEditableZone. C'est assez idiot (je trouve), car il suffit d'ajouter une bonne fois pour toute la figure au panel au moment du déclanchement de l'évènement mousePressed. Puis, de changer seulement la taille de la figure pendant le drag.
    Depuis que j'ai corrigé cette partie du code je n'ai plus une ribambelle d'évènements qui se déclenchent.

    J'espère que c'est la bonne solution, je vous tiens au courant.
    En Attendant, merci à tous !

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/04/2007, 10h09
  2. [Tableaux] Plusieurs valeurs pour une seule CheckBox
    Par Phenol dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2007, 17h54
  3. plusieurs styles pour un seul document
    Par philippe281281 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 02/10/2006, 17h45
  4. plusieurs formulaires pour une seule page ?
    Par lifecraft dans le forum ASP
    Réponses: 9
    Dernier message: 01/02/2006, 09h48
  5. [C#] Plusieurs LinkButton pour une seule fonction
    Par FunnyDjo dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/06/2005, 22h01

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