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

AWT/Swing Java Discussion :

Evènements multiples MouseListener


Sujet :

AWT/Swing Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut Evènements multiples MouseListener
    Bonjour,

    Le contexte est le suivant : j'ai une JFrame qui contient deux JPanel. L'un me sert à placer divers boutons/labels, l'autre servant à représenter une grille (qui sera modifiée).

    Dans la méthode paint(Graphics gr) de ma grille, je dessine donc cette dernière. Déjà à ce niveau, quelque chose m'interpelle : si je place des logs en début de méthode, je m'aperçois que l'on passe 4 fois dans cette méthode...

    En outre, cette grille étant amenée à recevoir des interactions utilisateurs, elle hérite d'un MouseListener. Et là, chaque évènement de ma souris est capté en double, ce qui n'est pas acceptable.

    Est-ce que quelqu'un aurait une idée de l'origine de ces évènements multiples ?

    Merci.

    Mako.

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Bonjour,

    Envoie ton code, et s'il est trop long fait un petit exemple reproduisant le problème.

    Edit : Tu as surement affecté 2 fois le mouselistener. Ou alors tu fait une boucle infini en appelant le repaint() depuis la méthode paintComponent(Graphics g)

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Citation Envoyé par Ivelios Voir le message
    Tu as surement affecté 2 fois le mouselistener.
    C'est ce que je m'étais dit aussi initialement, mais ma classe "Grille" (étendant de JPanel) n'est bien instancié qu'une seule et unique fois (singleton dans l'appli.).


    Citation Envoyé par Ivelios Voir le message
    Ou alors tu fait une boucle infini en appelant le repaint() depuis la méthode paintComponent(Graphics g)
    Cela m'étonnerait, car c'est toujours 4 passages dans le paint(Graphics gr), et 2 pour les onMouseXXX(). En outre, je n'utilise pas de repaint().

    Voici comment est composée (en tentant de simplifier) mon cas :

    Ma JFrame :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    public class Ecran extends JFrame {
     
    	/** Numero pour la serialisation */
    	private static final long serialVersionUID = -6472587156965001141L;
     
    	public void initialisation() {
    		// Deux panels : la carte et les boutons/labels
    		ecran.getContentPane().setLayout(new GridLayout(1, 2));
     
    		ecran.getContentPane().add(getPanelCarte());
    		ecran.getContentPane().add(getPanelInteractions());
     
    		ecran.setSize(640, 480);
    		ecran.setVisible(true);
    		ecran.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
     
    	/**
             * Retourne le panel permettant les interactions
             * 
             * @return JPanel le panel des interactions
             */
    	protected JPanel getPanelInteractions() {
    		if (panelInteractions == null) {
    			panelInteractions = new JPanel();
    		}
    		return panelInteractions;
    	}
     
    	/**
             * Retourne le panel permettant la carte
             * 
             * @return JPanel le panel de la carte
             */
    	protected JPanel getPanelCarte() {
    		if (panelCarte == null) {
    			panelCarte = new JPanel();
    		}
    		return panelCarte;
    	}
     
    	public JPanel ajouterBouton(JButton _button, int _positionX, int _positionY) {
    		panelInteractions = getPanelInteractions();
    		GridBagLayout grid = new GridBagLayout();
    		GridBagConstraints contraintes = new GridBagConstraints();
    		panelInteractions.setLayout(grid);
    		contraintes = new GridBagConstraints();
    		contraintes.insets = new Insets(3, 3, 3, 3);
     
    		contraintes.anchor = GridBagConstraints.NORTH;
    		contraintes.fill = GridBagConstraints.NONE;
    		contraintes.weighty = 1;
    		contraintes.weightx = 1;
    		contraintes.gridx = _positionX;
    		contraintes.gridy = _positionY;
    		contraintes.gridheight = 1;
    		contraintes.gridwidth = 1;
    		JComponent comp = _button;
    		grid.setConstraints(comp, contraintes);
    		panelInteractions.add(comp);
     
    		return panelInteractions;
    	}
    }
    Ma grille étendant de JPanel :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    public class Grille extends JPanel implements MouseListener {
     
    	/** Numero pour la serialisation */
    	private static final long serialVersionUID = 3405739528759914409L;
     
    	/** Singleton */
    	private static Grille carte;
     
            /** Juste pour voir le nombre de passage dans la methode paint() */
    	private int compteur;	
     
    	/**
             * Constructeur
             */
    	public Grille() {
    		this.addMouseListener(this);
    	}
     
    	public static Grille getInstance() {
    		if (carte == null) {
    			carte = new Grille();
    		}
    		return carte;
    	}
     
    	@Override
    	public void paint(Graphics gr) {
    		System.out.println("PAINT n°" + compteur);
    		compteur++;
    		System.out.println("--- this     : " + this);
    		System.out.println("--- graphics : " + gr.toString());
    		dessinerQuartCarte(gr, Grille.HAUT_GAUCHE);
    		dessinerQuartCarte(gr, Grille.HAUT_DROITE);
    		dessinerQuartCarte(gr, Grille.BAS_GAUCHE);
    		dessinerQuartCarte(gr, Grille.BAS_DROITE);
    	}
     
            private void dessinerQuartCarte(Graphics gr, short _quartCarte) {
                  // Dessine un quart de ma carte a base de gr.drawRect()
            }
     
    	@Override
    	public void mouseClicked(MouseEvent e) {
    		// Mise a jour de la case cliquee
                    // A la fin
                    this.revalidate(); // -> j'avoue ne pas me souvenir de pourquoi c'est là...
    	}
     
    	public static void ecrireDansCase() {
    		// Ecrit dans la case ce que l'on souhaite, a base de gr.drawString()
    	}
     
    	@Override
    	public void mouseEntered(MouseEvent e) {
    		System.out.println("mouse entered");
    	}
     
    	@Override
    	public void mouseExited(MouseEvent e) {
    		System.out.println("mouse exited");
    	}
     
    	@Override
    	public void mousePressed(MouseEvent e) {
    		System.out.println("mouse pressed");
    	}
     
    	@Override
    	public void mouseReleased(MouseEvent e) {
    		System.out.println("mouse released");
    	}
    }
    Et enfin, la façon dont je relie ma grille à mon ecran (dans une autre classe) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // ecran est un singleton de la classe Ecran
    ecran.add(Grille.getInstance());
    Je n'avais pas posté de codes dans mon premier message, car j'avais un peu peur que cela soit une source de confusion.

    Merci.

    Mako.

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Tu as surement affecté 2 fois le mouselistener.
    C'est ce que je m'étais dit aussi initialement, mais ma classe "Grille" (étendant de JPanel) n'est bien instancié qu'une seule et unique fois (singleton dans l'appli.).
    En continuant de tester, je me suis aperçu que c'était effectivement le cas. En fait, ma grille étant d'un classe supérieure (qui elle-même étend d'un JPanel), et j'avais ajouté le listener dans le constructeur aux deux niveaux... (qui a dit "boulet" ?)

    C'était le problème le plus préoccupant pour moi. Par contre, je ne comprends toujours pas pourquoi ces multiples passages dans le paint()...

    Mako.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    paint -> rien d'anormal, paint est appelé de nombreuses fois

    2 évènements, bizzare avec ce code. Je suis aussi étonné, il manque un implements MouseListener sur votre classe Grille, on pourrais avoir son code complet?

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    paint -> rien d'anormal, paint est appelé de nombreuses fois
    Je suis d'accord, mais là, c'est 4 fois au début, puis plus rien. C'est ceci qui me semblait anormal (mais je peux me tromper).

    Citation Envoyé par tchize_ Voir le message
    2 évènements, bizzare avec ce code. Je suis aussi étonné, il manque un implements MouseListener sur votre classe Grille, on pourrais avoir son code complet?
    J'ai édité le code (simple oubli en copiant). Quant à avoir le code complet, cela n'est plus nécessaire puisque j'ai trouvé d'où venait le soucis (Ivelios avait raison, double affectation due ici à un héritage mal négocié).

    Merci de vos réponses.

    Mako.

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

Discussions similaires

  1. [WD-2007] Evènement multiple BeforeClose
    Par did103 dans le forum VBA Word
    Réponses: 6
    Dernier message: 05/02/2016, 18h59
  2. Evénements multiples sur un <tr>
    Par lifty dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 18/08/2009, 09h42
  3. multiple implémentation de Mouselistener
    Par greg08 dans le forum Composants
    Réponses: 5
    Dernier message: 28/10/2008, 18h20
  4. Evénements souris, glisser-déposer, MouseListener
    Par soft0613 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 02/11/2007, 02h15
  5. Problème de MouseListener multiples
    Par pierre.zelb dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 23/06/2005, 11h18

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