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 !