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 :

Un nouveau composant fonctionne dans une Frame mais pas dans une autre. Pourquoi?


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 Un nouveau composant fonctionne dans une Frame mais pas dans une autre. Pourquoi?
    Bonjour à tous !

    Voilà mon problème :
    je crée un composant "Cercle" qui étend la classe Component : je veux qu'un objet Cercle soit dessinable. Pas trop difficile, jusque là. De plus, je veux qu'il soit à l'écoute-souris de lui-même, par exemple pour que quand la souris passe dessus il change sa couleur...

    Voici le code de ma classe Cercle :
    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
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class Cercle extends JComponent implements MouseListener, MouseMotionListener{
        int x , y , r;
        boolean couleurSwap;
     
        public Cercle(int _x , int _y , int _r)    {
            addMouseListener(this);
            addMouseMotionListener(this);
            x = _x;//Abscisse du centre
            y = _y;//Ordonnée du centre
            r = _r;
            couleurSwap = true;
        }
     
        public boolean contains(int x,int y){
             return (Math.sqrt((this.x-x)*(this.x-x)+(this.y-y)*(this.y-y))<=r);
        }
     
        public void paint(Graphics g){   
            if( couleurSwap ){
    				g.setColor( Color.BLUE );
    			}
    			else{
    				g.setColor( Color.RED );
    			}         
            g.fillOval(x-r,y-r,2*r,2*r);
        }
     
         //MouseListener
        public void mouseClicked(MouseEvent e){
        }        
        public void mouseEntered(MouseEvent e){
            couleurSwap = ! couleurSwap;
            repaint();
        }
        public void mouseExited(MouseEvent e){
            couleurSwap = ! couleurSwap;
            repaint();
        }    
        public void mousePressed(MouseEvent e){
        }
        public void mouseReleased(MouseEvent e){
        }        
        //MouseListener
     
        //MouseMotionListener
        public void mouseDragged(MouseEvent e){
        }    
        public void mouseMoved(MouseEvent e){
        }            
        //MouseMotionListener    
    }
    A priori, ça marche ... Je le prouve dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import javax.swing.*;
     
    public class Ex{
        private JFrame f;
     
        public Ex(){
            f = new JFrame("Prog");
            f.getContentPane().add(new Cercle(100,100,50));
            f.pack();
            f.setVisible(true);
        }
    }
    Le problème arrive ici : en refaisant quasi la même chose que le code ci-dessus, si ce n'est que le dessin se fait dans une autre classe : Panneau (qui étend JPanel). Et puis le contentPane de la Frame est un objet Panneau :

    Classe Panneau :
    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
    import javax.swing.*;
    import java.awt.*;
     
    public class Panneau extends JPanel{
        Cercle c;
     
        public Panneau(){
            c = new Cercle(100,100,65);
            add(c);
            repaint();
        }
     
        public void paint(Graphics g){
            super.paint(g);
            c.paint(g);
        }
    }
    Classe ExAvecPanneau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import javax.swing.*;
     
    public class ExAvecPanneau{
        private JFrame f;
     
        public ExAvecPanneau(){
            f = new JFrame("Prog");
            f.setContentPane(new Panneau());
            f.pack();
            f.setVisible(true);
        }
    }

    Pourquoi cela ne marche-t-il pas dans ce code ?
    En fait, l'objet Cercle qui est dans le Panneau (= contentPane de la Frame) n'est pas écouté! Pourquoi ?

    Merci !

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

    Personne n'a de réponse à mon problème ?

    Ça ne parait bizarre à personne que le premier exemple fonctionne mais pas le 2ème ?

    J'ai sans doute louper un gros truc, mais ... j'espère que quelqu'un prendra quelques minutes pour me l'expliquer!

    D'avance ... Merci !

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2002
    Messages
    705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 705
    Par défaut
    comme pour JComponent jpanel doit implémenter le MouseListener

  4. #4
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 30
    Par défaut
    comme il ta dis tu dois implemeter le MouseListener
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class panneau exetnds JPanel implements MouseListener, MouseMotionListener{
    c'est l'entete de votre classe ainsi que tu dois ajouter les methodes de l'interface MouseListener.

    bonne chance.

  5. #5
    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 beaucoup!

    Je vais tester ça ce soir (j'ai pas l'occasion de le faire ici...)...

    En attendant ... Je dois simplement dire que la classe Panneau est écoutée, ou bien je dois indiquer du code dans les méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void mouse***(MouseEvent e){ ... }
    ?

    Le fait que j'écrive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ... implements MouseListener,MouseMoveListener
    // et les méthodes VIDES associées à ces interfaces
    suffit pour que l'écoute soit transmise à mon objet cercle?

    Ou alors je dois mettre du code dans les méthode ?

    Encore merci !

    Je teste tout ça ce soir, mais en lisant vos réponses, ces questions me sont venues à l'esprit

    A bientôt !

  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
    Me re-voilà ... Tests faits ... Et ... Comme je le craignais, juste le fait de faire écouter le panneau par la souris ne suffit pas ... Voici le nouveau code de mon Panneau :
    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
     
    import javax.swing.*;  import java.awt.*;  import java.awt.event.*;
     
    public class Panneau extends JPanel implements MouseListener,MouseMotionListener{
        Cercle c;
     
        public Panneau() {
            c = new Cercle(100,100,65);
            add(c);
            repaint();
            this.addMouseMotionListener(this);
            this.addMouseListener(this);
        }
     
        public void paint(Graphics g) {
            super.paint(g);
            c.paint(g);
        }
     
        //MouseListener
        public void mouseClicked(MouseEvent e){    }        
        public void mouseEntered(MouseEvent e){    }
        public void mouseExited(MouseEvent e){    }    
        public void mousePressed(MouseEvent e){    }
        public void mouseReleased(MouseEvent e){    }        
     
        //MouseMotionListener
        public void mouseDragged(MouseEvent e){    }    
        public void mouseMoved(MouseEvent e){    }            
    }
    En mettant uniquement ça, je me disais (mais sans trop y croire...) que les objets inclus au Panneau recevraient aussi l'écoute... Ce n'est pas le cas !

    Comment faire passer l'écoute à l'objet Cercle, à partir de la classe Panneau?

    Merci !

    A plus tard

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

Discussions similaires

  1. [XL-2010] macro fonctionne dans l'editeur mais pas depuis une feuille
    Par Kanetsugu dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/12/2011, 06h56
  2. Réponses: 0
    Dernier message: 03/04/2008, 15h14
  3. Ce qui est dans une table mais pas dans l'autre !
    Par youyoule dans le forum Requêtes
    Réponses: 4
    Dernier message: 30/12/2007, 12h57
  4. [RegEx] Regex qui fonctionne dans un preg_replace mais pas dans un ereg
    Par méphistopheles dans le forum Langage
    Réponses: 4
    Dernier message: 31/03/2007, 11h56
  5. Réponses: 5
    Dernier message: 02/10/2006, 19h24

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