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

Composants Java Discussion :

Comment faire réagir un composant au survole de la souris (problème de zone écouté)


Sujet :

Composants Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut Comment faire réagir un composant au survole de la souris (problème de zone écouté)
    Bonjour à tous,

    J'ai un composant C implémenté par MouseMotionListener inclus dans un JPanel implémenté par MouseListener. Je voudrais faire réagir le composant C quand la souris le survole. Pour cela, dans la classe de C, j'utilise la méthode mouseMoved. Le problème est que cette méthode se lance quand la souris est en mouvement même à l'extérieur du composant C (on reste à l'intérieur du JPanel). J'imagine que la zone écouté est celle du JPanel alors qu'il faudrait que ça soit celle du composant C.

    Comment puis-je faire pour faire réagir le composant C quand la souris le survole ?

    Voici mon code :

    Classe Antenne (que j'ai nommé composant C ci-dessus) :
    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
    public class Antenne extends JPanel implements MouseMotionListener{
     
    	private int x,y,l,h;
    	Graphics g;
     
    	Antenne(){x=10;	y=10;l=10;h=10;}
    	Antenne(int a, int b, int c, int d){
    		x=a;y=b;l=c;h=d;
    	}
     
    	int getX1(){return x;}
    	int getY1(){return y;}
    	int getL(){return l;}
    	int getH(){return h;}
     
    	void drawG(JPanel p){
    		g=p.getGraphics();
    		int i;
    		for(i=0;i<200;i=i+50)
    			g.drawOval(x-i,y-i/3,l+2*i,h+2*i/3);
    	}
     
    	public void mouseDragged(MouseEvent e) {}
    	public void mouseMoved(MouseEvent e) {
    		int i=150;
    		g.fillOval(x-i,y-i/3,l+2*i,h+2*i/3);
    	}
    }
    Classe du 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
    public class Carte extends JPanel implements  MouseListener
    {
    	private Graphics g;
    	JPanel pa;
     
    	public Carte(JPanel p) {
    		this.pa=p;
    		pa.setBackground(Color.WHITE); 
    	}
     
    	public void mouseClicked(MouseEvent e) {
    		Antenne A = new Antenne(e.getX()-50,e.getY()-10,100,20);
    		A.drawG(pa);
    		pa.addMouseMotionListener(A);
    	}
     
    	public void mouseEntered(MouseEvent e) {}
    	public void mouseExited(MouseEvent e) {}
    	public void mousePressed(MouseEvent e) {}
    	public void mouseReleased(MouseEvent e) {}
    Un grand merci à tous pour votre aide

    :-)

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    C'est parce que tu fait le addmousemotionlistener sur le panel et non sur le composant en question.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Comme tu me l'as conseillé, j'ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pa.addMouseMotionListener(A);
    Par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A.addMouseMotionListener(new MouseMotionAdapter(){public void mouseMoved(MouseEvent r) {
    		int i=150;
    		g.fillOval(x-i,y-i/3,l+2*i,h+2*i/3);
    	}});
    Mais ça ne marche pas. Pourtant il me semble que addMouseMotionListener est cette fois-ci bien défini ...

  4. #4
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    D'où vient ce g ?

    Par ailleurs, il vaut mieux utiliser les mouseEntered et mouseExited du MouseListener pour traiter les survols. C'est précisé à How to Write a Mouse Listener.
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Le g est le dessin dans le JPanel. C'est vrai que cette variable ne sert à rien dans la classe Carte mais vu que j'ai besoin de dessiner au fur et à mesure j'utilise " g=p.getGraphics(); ". Du coup je suis obligé d'introduire g.
    Est-ce une mauvaise méthode?

    Je prends note que les méthodes les plus adaptées pour traiter les survols sont mouseEntered et mouseExited. J'avais déjà essayé avec mais vu que la zone écoutée est le JPanel, l'action que je souhaitais se déclenchait lors de l'entrée et de la sortie du JPanel et non pas de l'objet Antenne.

    Merci pour le lien

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu ne devrais pas accéder au Graphics d'un objet en dehors du process de painting. L'objet Graphics que tu utilise n'est peut être plus valide. Il faut, dans ton évènement, demander au composant de se redessiner, et dans le redessinage, utiliser le Graphics ad-hoc.

  7. #7
    Membre confirmé Avatar de ngpub
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 449
    Points : 505
    Points
    505
    Par défaut
    Concrètement ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void mouseClicked(MouseEvent e) {
    	Antenne A = new Antenne(e.getX()-50,e.getY()-10,100,20);
    	A.drawG(pa);
    	pa.addMouseMotionListener(A);
    }
    Tu crées une antenne mais tu ne l'ajoutes pas dans l'affichage donc elle ne risque pas de recevoir les événements.

    D'ailleurs Avant de voir le rollover, est-ce que ton affichage fonctionne ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Merci à tous pour votre aide.

    Pour répondre à tchize_, l'affichage marche bien. Malgré cela, pense-tu que ça pourrait venir du dessin?

    Pour répondre à ngpub, l'affichage marche bien : à chaque fois que je click dans le JPanel une Antenne se créée et s'affiche. Le problème vient peut-être du fait que je n'utilise pas bien le addMouseMotionListener.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par scorplayer Voir le message
    Merci à tous pour votre aide.

    Pour répondre à tchize_, l'affichage marche bien. Malgré cela, pense-tu que ça pourrait venir du dessin?
    Ajoute un System.out.println dans ton mouseListener, pour voir si tu passe dedans ou pas

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    C'est ce que j'ai fait : il rentre dans le MouseListener de Carte mais pas dans celui de Antenne. Donc l'objet que je souhaite écouté n'est pas le bon.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    J'ai trouvé la solution en prenant le problème d'une autre manière : utilisation de la fonction Shape.contains(double x, double y) pour détecter un Ellipse2D.Double().

    Pour ceux qui sont intéressés : discussion sur le forum Graphisme 2D.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/08/2011, 21h19
  2. Réponses: 4
    Dernier message: 23/01/2011, 16h45
  3. Comment faire ses propres composants?
    Par ruza01 dans le forum Composants
    Réponses: 11
    Dernier message: 26/02/2010, 11h19
  4. Réponses: 0
    Dernier message: 20/02/2009, 16h13
  5. Comment faire une table-arbre comme celle de la view "Problèmes" ?
    Par leonelag dans le forum Eclipse Platform
    Réponses: 6
    Dernier message: 21/08/2007, 12h56

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