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 :

Component . addMouseListener ( quelqueChose)


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Par défaut Component . addMouseListener ( quelqueChose)
    Bonjour!

    Pas évident à formuler, l'intitulé...

    Voici mon problème : j'aimerai faire un objet graphique, par exemple un Cercle. Pas de soucis pour faire une classe Cercle que je peux faire dessiner sur un composant "dessinable".

    Ce que j'aimerai de plus, c'est pouvoir ajouter un écouteur d'évènements liés à la souris (la souris passe sur le composant, elle y entre, ...).

    Plus en détails : imaginons, par exemple, qu'on veuille créer plusieurs objets Cercle, représentés en "drawOval()" (cercle vide) sur un JPanel, et que ces cercles se remplissent dès que la souris passe dedans...
    Je sais qu'il y a moyen de le faire en faisant écouter les mouvements de la souris dans le JPanel et en faisant un test sur les coordonnées du curseur... Mais j'aimerai le faire autrement : que dès qu'un objet Cercle soit créé, un écouteur lui soit associé et indique si OUI ou NON la souris entre dans cet objet.

    J'ai essayé en étendant la classe Component et en implémentant les interfaces MouseListener et MouseMotionListener, et en ajoutant l'objet comme son propre écouteur... Mais comme je m'y attendais, ça ne donne rien... J'ai essayé de plus de surcharger la méthode boolean contains(int x,int y) de Component, au cas où la JVM disait que la souris entre dedans dès que ses coordonnées sont contenues (donc via cette méthode), mais ... Ca ne donne rien non plus (et je m'y attendais aussi...)

    Voici quand même un bout de code pour vous indiquer encore plus ce que je veux faire :

    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
     
    public class Cercle extends Component implements MouseListener, MouseMotionListener
    {
        int x , y , r;
     
        public Cercle(int _x , int _y , int _r)
        {
            x = _x;
            y = _y;
            r = _r;
            this.addMouseListener(this);
            this.addMouseMotionListener(this);
        }
     
        public boolean contains(int x,int y)
        {
            return (this.x-x)*(this.x-x)+(this.y-y)*(this.y-y)<=r*r;
        }        
     
        public void paintComponent(Graphics g)
        {            
            g.fillOval(x-r,y-r,2*r,2*r);
        }
     
         //MouseListener
        public void mouseClicked(MouseEvent e){
            JOptionPane.showMessageDialog(null,"mouseClicked");
        }        
        public void mouseEntered(MouseEvent e){ }
        public void mouseExited(MouseEvent e){ }
        public void mousePressed(MouseEvent e){ }
        public void mouseReleased(MouseEvent e){ }        
        //MouseListener
     
        //MouseMotionListener
        public void mouseDragged(MouseEvent e){ }
        public void mouseMoved(MouseEvent e){ }            
        //MouseMotionListener
    }
    Je ne suis pas sur d'avoir été clair sur ce que je veux faire ... J'espère que oui ...

    Merci d'avance à ceux qui pourront m'aider!

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Sans etre certain, surcharge aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public boolean contains(Point p)

  3. #3
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Par défaut
    Merci de ta réponse, mais malheureusement, cela ne suffit pas non plus...

    Je suis quand même content d'avoir eu une réponse, c'est que mon problème est compréhensible, alors !

    J'espère qu'il sera solutionnable ...

    A plus...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Pas testé mais tu peux essayer dans le mouse listener d'appeler la méthode consume() sur l'évennement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void mouseEntered(MouseEvent e){
      if (!contains(e.getX(), e.getY()) {
        e.consume();
      }
    }
    (pareil pour toutes les autres méthodes)

  5. #5
    Membre Expert
    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
    Par défaut
    C'est peut être parce que tu mélanges composants swing et composants awt. Si tu ajoutes ton Cercle à un JPanel, alors il vaut mieux faire hériter le Cercle d'un javax.swing.JComponent, non d'un java.awt.Component.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Citation Envoyé par poppels Voir le message
    Merci de ta réponse, mais malheureusement, cela ne suffit pas non plus...

    Je suis quand même content d'avoir eu une réponse, c'est que mon problème est compréhensible, alors !

    J'espère qu'il sera solutionnable ...

    A plus...
    Je pense, je vois que ton cercle étend "Component", mais que tu parle de le mettre dans un JPanel, il ne faut pas mélanger les composant heavyweight (awt classique) et lightweight (swing), demande à ton cercle d'étendre JComponent et çà ira probablement.

    Les règles utilisées par java pour trouver le composant à des coordonnées données sont ici: http://java.sun.com/j2se/1.4.2/docs/...tAt(int,%20int)


    Edit: Grillé

  7. #7
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Par défaut
    Citation Envoyé par the-gtm Voir le message
    Pas testé mais tu peux essayer dans le mouse listener d'appeler la méthode consume() sur l'évennement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void mouseEntered(MouseEvent e){
      if (!contains(e.getX(), e.getY()) {
        e.consume();
      }
    }
    (pareil pour toutes les autres méthodes)
    Merci de ta réponse... Je testerai ça ce soir ou demain ... Ceci dit, je doute que celà fonctionne : le programme ne rentre jamais dans les méthodes mouse***( ... ). Ce que je cherche est justement de savoir comment "faire entrer" le programme dans une méthode mouse***(...) pour un nouveau composant...

    Pour gifffftane et tchize_ :
    merci de vos réponses ... Je vais tester aussi ça et je vous tiens au courant... Mais ... Si je comprend bien ces réponses, celà signifierait que si j'insère un objet Button dans un objet JPanel, l'objet Button ne pourra pas être écouté? C'est bizarre ... Enfin ... J'essayerai de mettre TOUT en swing et je verrai bien ... (mais ... je reste un peu sceptique )

    Tout ça reste encore un peu flou ... Mais la lumière se rapproche

    Merci à vous, en tous cas!

  8. #8
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Par défaut
    Et non, comme je me disais bien vos solutions ne marchent malheureusement pas

    Personne d'autre aurait une éventuelle solution ?

    ...

    Je rame un peu là ...

    En fait, j'aimerai bien savoir comment un écouteur sait que la souris entre dans un nouvel objet d'une classe héritant de Component (ou de JComponent) ... Il me semble que c'est grâce à la méthode contains(int x,int y) ... Me trompe-je? J'ai, me semble-t-il, bien écrit ma méthode contains... Alors ... Pourquoi ça ne marche pas?

    Merci de m'aider!

  9. #9
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Ton cercle est entièrement contenu dans ton Component. Donc les coordonnées X et Y sont inutiles. Ces coordonnées seront portées par le Panel qui reçoit ton cercle.
    Ton Component contient la totalité du cercle. Lorsque le Panel qui le contient va lui demander si un clic est dans le cercle, il va lui transmettre les coordonnées à partir du coin haut gauche du Component. Il faut voir ton Component comme un carré et le cercle est inscrit dans ce carré.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  10. #10
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Par défaut


    Heu ... Merci à toi de porter de l'intérêt à mon problème ... mais ... je ne comprends pas comment me servir de ton aide ...

    Tu peux m'en dire plus ? Un bout de code, peut-être?

    Puis ...
    Ton cercle est entièrement contenu dans ton Component. Donc les coordonnées X et Y sont inutiles.
    Je ne comprends pas ce que tu veux dire ... Un cercle est défini par son centre, de coordonnées X et Y, et son rayon : r. Néanmoins, ce que tu me dis me fait penser que ma méthode paint(Graphics g) n'est pas bonne ... Je la réédite ... N'empêche ... Ca ne change rien et ça ne marche toujours pas! Je continue de plancher la dessus . . .

    Merci à ceux (celui?) qui pourront m'aider !

  11. #11
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Je me suis peut-être mal exprimé. Je recommence donc, mais un peu différemment
    Afin d'être sûr que ton cercle est toujours dans ton Component, et que le Component n'est jamais plus grand que le cercle, il faut calculer les coordonnées du centre (tes x et y) en fonction de la taille de ton Component. Dans le constructeur, tu ne lui transmet que le rayon.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  12. #12
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Par défaut
    Citation Envoyé par dinobogan Voir le message
    Afin d'être sûr que ton cercle est toujours dans ton Component, et que le Component n'est jamais plus grand que le cercle, il faut calculer les coordonnées du centre (tes x et y) en fonction de la taille de ton Component. Dans le constructeur, tu ne lui transmet que le rayon.
    Heu ...

    Je veux créer un cercle à un endroit donné et avec un rayon donné, donc Cercle(int x, int y, int r). Mon nouveau Component, c'est mon Cercle ... Je ne comprends à nouveau pas (et j'en suis bien désolé ! )ce que tu veux dire ... Calculer les coordonnées du centre en fonction de la taille de mon Component

  13. #13
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Voici le code qui fonctionne
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    	public class Cercle extends Component implements MouseListener
    	{
    		int		r;
    		boolean	couleurSwap;
     
    		public Cercle( int _r )
    		{
    			r = _r;
    			couleurSwap = true;
    			this.addMouseListener( this );
    		}
     
    		@Override
    		public int getHeight()
    		{
    			// TODO Auto-generated method stub
    			return 2 * r;
    		}
     
    		@Override
    		public Dimension getPreferredSize()
    		{
    			// TODO Auto-generated method stub
    			return new Dimension( getWidth(), getHeight() );
    		}
     
    		@Override
    		public Dimension getSize()
    		{
    			// TODO Auto-generated method stub
    			return getPreferredSize();
    		}
     
    		@Override
    		public int getWidth()
    		{
    			// TODO Auto-generated method stub
    			return getHeight();
    		}
     
    		public boolean contains( int x, int y )
    		{
    			return carre( r - x ) + carre( r - y ) <= carre( r );
    		}
     
    		private int carre( int i )
    		{
    			return i * i;
    		}
     
    		@Override
    		public void paint( Graphics g )
    		{
    			paintComponent( g );
    		}
     
    		public void paintComponent( Graphics g )
    		{
    			if( couleurSwap )
    			{
    				g.setColor( Color.BLACK );
    			}
    			else
    			{
    				g.setColor( Color.RED );
    			}
    			g.fillOval( 0, 0, getWidth(), getHeight() );
    		}
     
    		public void mouseEntered( MouseEvent e )
    		{
    			couleurSwap = !couleurSwap;
    			repaint();
    		}
     
    		public void mouseExited( MouseEvent e )
    		{
    			couleurSwap = !couleurSwap;
    			repaint();
    		}
     
    		// MouseListener
    		public void mouseClicked( MouseEvent e )
    		{}
     
    		public void mousePressed( MouseEvent e )
    		{}
     
    		public void mouseReleased( MouseEvent e )
    		{}
    		// MouseListener
    	}
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  14. #14
    Membre confirmé
    Inscrit en
    Août 2002
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 132
    Par défaut
    Merci bien à tous !

    En fait, le problème ne vient pas du code que j'ai donné ... Ce code fonctionne ! ! ! Désolé . . . Mon problème n'étais pas au bon endroit ...

    Nouveau problème : un composant "fonctionne" bien dans une Frame et pas dans une autre ... Par "fonctionne", je veux dire qu'il est bien écouté ... Je crée un nouveau post ...

    Il est ici.

    Encore merci à vous ! (et surtout à dinobogan ... qui m'a bien mis la puce à l'oreille )

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

Discussions similaires

  1. "component" sur autre base de données
    Par k4eve dans le forum Hibernate
    Réponses: 4
    Dernier message: 12/04/2005, 10h48
  2. [FLASH MX 2004]Scrollpane component
    Par cavo789 dans le forum Flash
    Réponses: 10
    Dernier message: 23/06/2004, 12h18
  3. comment acceder a un component lui meme dans un panel
    Par mimosa7 dans le forum Composants
    Réponses: 2
    Dernier message: 17/11/2003, 00h02
  4. [Crystal report] Component
    Par Antichoc dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 24/04/2003, 17h11
  5. Component not found
    Par Pm dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 15h40

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