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:
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:
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:
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:
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 !
Le problème venait du Layout
Salut tout le monde !
En continuant de chercher, en indiquant les coordonnées de la souris, je me suis rendu compte qu'elles étaient parfois négatives . . . :? :? :roll:
En fait, je me suis rendu compte que, pour la souris, sur le JPanel, le zéro horizontal n'était pas à l'extrême gauche, mais au milieu du panneau !
Pourquoi ? ? ? :?
Et bien ... simplement parce que le Layout par défaut d'un JPanel est un FlowLayout, qui centre les composant !
La solution était donc de changer de Layout... Le plus simple pour moi a été de ne pas en mettre du tout (le panneau ne me servira que pour dessiner!)
Voilà !
Il ne faut jamais désespérer (et ... j'étais en train de quand ... PAF ! Tout à coup ... j'ai trouvé :yaisse2::yaisse2::yaisse2:)
Bonne journée à tous !