Problème de déplacement d'un objet dessiné
bonjour,
j'ai ecris ce code :
Code:
1 2 3 4 5 6 7 8
|
public interface Dessinable {
public void dessiner(Graphics g);
public Rectangle getRectangle();
} |
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
|
public abstract class FormesDessinable implements Dessinable{
protected Rectangle rectangle;
protected Color color = Color.BLACK;
/** Creates a new instance of FormesDessinable */
public FormesDessinable(Point position, Dimension dimention) {
this.rectangle = new Rectangle(position,dimention);
}
public abstract void dessiner(Graphics g);
public Rectangle getRectangle(){
return this.rectangle;
}
public Point getPoint(){
return this.rectangle.getLocation();
}
public void setPoint(Point p){
this.rectangle.setLocation(p);
}
} |
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 56 57 58 59 60 61 62
|
public class SurfaceDeDessin extends JPanel implements MouseListener, MouseMotionListener{
/** Creates a new instance of SurfaceDeDessin */
public SurfaceDeDessin() {
addMouseListener(this);
addMouseMotionListener(this);
setBackground(Color.WHITE);
}
//dessine tous les objets de ma liste d'objets cree
public void paint(Graphics g){
super.paint(g);
for(FormesDessinable f :listeDesFormes)
f.dessiner(g);
}
// un click de bouton ajoute un rectangle dans la liste et
// le repaint le dessine
public void mouseClicked(MouseEvent e) {
Forme F = new Forme(new Point(e.getPoint()));
listeDesFormes.add(F);
repaint();
}
//pour puvoir faire bouger l'objet je detecte si j'ai bien clické sur un objet
public void mousePressed(MouseEvent e) {
FormesDessinable FD = getObjet(e.getPoint());
if (FD == null)
return;
objetEnDeplacement = FD;
}
public void mouseReleased(MouseEvent e) {
objetEnDeplacement = null;
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
//je fait le setPoint pour lui donner les nouvelles coordonné puis reapint
public void mouseDragged(MouseEvent e) {
if(objetEnDeplacement != null){
objetEnDeplacement.setPoint(e.getPoint());
repaint();
}
}
public ArrayList<FormesDessinable> getListeDesFormes() {
return listeDesFormes;
}
//revoie l'objet a partir du point sur le quel on a cliké
public FormesDessinable getObjet(Point p){
for(FormesDessinable F : listeDesFormes){
if(F.getRectangle().contains(p))
return F;
}
return null;
}
private FormesDessinable objetEnDeplacement = null;
private ArrayList<FormesDessinable> listeDesFormes = new ArrayList<FormesDessinable>();
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
///le forme que je vais dessiner
public class Forme extends FormesDessinable {
public Forme(Point position) {
super(position,new Dimension(90,30));
}
public void dessiner(Graphics g) {
g.setColor(color);
g.drawRect(rectangle.x,rectangle.y,rectangle.width,rectangle.height);
g.setColor(Color.white);
}
} |
le problème c'est que quand je click sur le carré pour le bouger, il bouge sans problème, mais une fois déplacé je ne peut plus le bougé que a partir de sa position initiale : je m'explique:
supposant que j'ai dessiner le carré au point 10,10 de ma surface de dessin et que ensuite je le deplace ju'squau point 80,80, il se deplace bel et bien cad qil se trouve bien au oint 80,80 mais si je veux le redeplacer et que je place le souris sur le point 80,80 il ne bouge pas. par contre si je place ma souris au point 10,10 et que je bouge la souris mon carré se redessine a ce point et il est possible alors de le deplacer, je n'arrive pas a savoir pq !!???
qq a une idée ???
mreci
je n'ai pas bien compris !!
C'est un vieux sujet mais ....
je n'ai pas bien compris ce que veux dire jibbi par "La méthode mouseMoved(MouseEvent m) n'est pas overridé" :mur:
Cependant, j'ai compilé le code, et j'ai remarqué que lorsqu'on fait un drag avec la souris, le rectangle saute "brutalement" de sa position initiale à la position de la souris puis il est "drager" normalement par la souris.
Une solution à ce saut brutal est de se souvenir de sa position du départ dans la class SurfaceDeDessin.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
....
private int xmo, ymo, xro, yro;
....
public void mousePressed(MouseEvent e) {
FormesDessinable FD = getObjet(e.getPoint());
if (FD == null) return;
objetEnDeplacement = FD;
xro = FD.getRectangle().x;
yro = FD.getRectangle().y;
xmo = e.getX();
ymo = e.getY();
}
....
public void mouseDragged(MouseEvent e) {
if(objetEnDeplacement != null){
objetEnDeplacement.setXYPoint(xro+e.getX()-xmo, yro+e.getY()-ymo);
repaint();
}
}
.... |
Voila c'est tout :pastaper: