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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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
    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
    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!

  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
    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!

  8. #8
    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
    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é

+ 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, 09h48
  2. [FLASH MX 2004]Scrollpane component
    Par cavo789 dans le forum Flash
    Réponses: 10
    Dernier message: 23/06/2004, 11h18
  3. comment acceder a un component lui meme dans un panel
    Par mimosa7 dans le forum Composants
    Réponses: 2
    Dernier message: 16/11/2003, 23h02
  4. [Crystal report] Component
    Par Antichoc dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 24/04/2003, 16h11
  5. Component not found
    Par Pm dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 14h40

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