# Java > Interfaces Graphiques en Java > AWT/Swing >  comment dplacer un objet avec la souris

## domi's

Bonsoir,

Je suis dbutante en JAVA, et je cherche  implmenter un jeu qui consiste  dplacer des moitis de figures pour reformer les figures entires. 
Mon problme est de trouver un moyen pour que lorsque l'on clique sur un objet celui-ci soit fix  la souris, qu'il se dplace avec elle, et une fois qu'on reclique il faudrait que l'objet se dpose. J'ai fais des recherches mais a part un peu dans tous les sens, si l'un d'entre vous pourrait m'indiquer une marche  suivre la plus simple possible ce serait merveilleux,
J'ai pour l'instant crer une fentre avec un bouton, mais je ne vois pas comment prendre en compte l'action de la Souris sur le bouton, je sais qu'il faut utiliser des MouseListener, mais le codage de tout est trs confus pour moi, je ne sais pas par o commencer ni s'il faut utiliser un drag'n drop ou mme s'il faut crer un ou plusieurs panels... en gros je suis compltement perdue, votre aide sera la bienvenue, merci d'avance.

----------


## joel.drigo

Salut,

Il te faudra utiliser en complment du MouseListener , un MouseMotionListener pour pouvoir ragir aux mouvements de la souris. La classe MouseMotionAdapter combine dj ces deux couteurs. Ensuite, il faut prendre en compte les coordonnes relatives du composant dplac par rapport aux coordonnes de la souris. Comme tes composants sont dplaables  des coordonnes quelquonques, il faudra supprimer le layout manager, qui justement sert  grer automatiquement les coordonnes (et les tailles) des composants.

Voici un exemple de principe :



```

```

Personnellement, j'utilise une bibliothque qui me permet de grer a beaucoup plus facilement, et beaucoup d'autres choses, qui s'appelle Piccolo2D.

----------


## domi's

MERCCIIIIII mille fois!!!!!, 
c'est exactement ce dont j'avais besoin!!!!!
Tu me sauves!

je vais tudier attentivement ce code, pour tout comprendre, merci encore!!!

----------


## domi's

reBonjour,

J'essaie d'appliquer le code fourni plus haut  une fentre (JFrame) contenant un JPanel qui lui mme contient un JLabel, 
pour les components cela ne pose pas de problme car ce sont des JLabel, cependant j'ai un soucis avec le container, enfin je pense que le problme viens de l car lorsque j'applique ce code   cette fentre, les JLabels ne bougent pas, auriez-vous une ide?

----------


## joel.drigo

Normalement, pas de diffrence entre des JPanel et des JLabel (ou plus gnralement des conteneurs et des composants dans des conteneurs).

Le seul problme qu'on peut rencontrer, ventuellement, c'est que si on veut pouvoir dplacer les composants et leur conteneur, les composants vont devoir couter les vnements souris, et donc vont capter ceux qu'on pourrait vouloir couter dans le conteneur, qui va couter les mmes vnements que ses contenus. Autrement dit, c'est le composant le plus haut qui capte les vnements, et celui en-dessous ne peut les capter que la o aucun composant n'est affich dedans.

Trois possibilits :

1) si le conteneur et son contenu sont totalement solidaires (on ne peut pas dplacer un des composants  l'intrieur du conteneur). Dans ce cas, il suffit d'couter les vnements uniquement sur le conteneur. Seul problme : si le composant contenu  besoin d'avoir une gestion vnementiel, comme pour un JButton, ou pour un JTextField, tu ne pourras pas dplacer ton conteneur lorsque la souris est positionn dans le composant, qui va capter les vnements. Mais avec des JLabel, cela fonctionne trs bien.
2) sinon, si le conteneur et les composants  l'intrieur coutent tous les vnements (par le mme MouseMotionAdapter), on pourra dplacer le conteneur en cliquant dans les "trous" (les endroits du conteneur entre les composants). Les contenus vont suivre, puisque placs relativement au conteneur.
3) l'alternative  la deuxime solution est d'avoir 2 modes. De nombreuses applications grent a comme a : un mode qui permet de dplacer les conteneurs, un mode qui permet de dplacer les composants  l'intrieur.

Accessoirement, lorsque l'interface sort un peu des sentiers battus, le fait d'utiliser des composants d'UI standard comme des JLabel ou des JPanels, savrent souvent moins pratique que de grer soit mme des composants graphiques _maison_, dessins dans un canvas, avec gestion des vnements fait soi mme. Pour avoir personnellement ce genre d'interface dans l'application professionnelle sur laquelle je travaille, je n'utilise absolument pas les composants standards d'UI. Pour viter d'avoir  tout rcrire, j'utilise une bibliothque, appele Piccolo2D, qui me permet de grer ce genre de chose (entre autres). Elle ajoute justement des concepts supplmentaires qui n'existe pas en UI SWING standard, qui permet d'indiquer si le contenu est solidaire, ou pas (ou si le conteneur se dplace indpendamment de ses contenus, par exemple), si des vnements doivent tre capts par le conteneur, ou transmis au contenu (et  quel contenu...), et, surtout, on peut grer a trs finement, en fonction des composants, des _modifiers_ (par exemple dire que sur CTRL-DRAG on dplace le contenu, et sur DRAG on dplace le contenant, par exemple), etc. Accessoirement, la bibliothque m'empche pas d'utiliser  certains endroits des composants SWING.

----------


## domi's

merci pour cette rponse, du coup j'aimerais avoir ton avis sur la marche  suivre (utiliser les standard ou plutt faire a maison), voici le bout de code que j'ai  ma disposition : 


```

```




il est plutt simple, et intuitif mais je n'arrive pas  appliquer le code que tu m'as fourni plus haut  celui la, aurais-tu une ide?

----------


## joel.drigo

C'est plutt difficile de juger avec si peu de code, et sans description globale. L, tu as 4 images, places librement dans un panel : d'un ct je me dis que pour si peu, autant ne pas (r)crire des composants maison (cela peut tre beaucoup de travail, et peut tre plus ou moins long  mettre au point), mais d'un autre ct, dessiner 4 images dans un canvas n'est pas collossale, et utiliser des labels juste pour afficher des images dans un panel sans layout est un peu utiliser 3 % des capacits des composants (un peu comme utiliser un bus  2 tages pour transporter une personne, y compris le chauffeur, pour traverser la rue). En particulier, si le but final est de faire un jeu, dans lequel il pourrait y avoir plus d'images, avec une grande libert de placement (donc plus ou moins complexe  faire avec un layout, mme maison), de l'animation peut tre. Le bouton exit pourrait tre gr  part dans son propre panel avec layout, avec un canvas spcifique qui affiche des images pour la partie plateau de jeu.

Par ailleurs, je ne vois aucunement le type de structure dont tu parlais (des composants  dplacer dans un autre composant  dplacer) : donc, soit je n'ai pas compris ce que tu voulais dire, soit ton extrait de code n'est pas assez pertinent.

Pour appliquer mon exemple  ton code, c'est pourtant assez direct : tu as exactement la mme structure que j'ai. Ce que j'ai appel MoveComponents est le JPanel gamePanel dans ton code. Et au lieu de crer des JComponents dans une boucle, tu crs des JLabel en squence (penses juste  appeler setEnabled(false) sur ces JLabels) . Ce qui doit te gner, c'est que tu as une classe gameWindow qui tend JPanel, mais que tu n'utilises pas comme panel, mais seulement comme _coquille_ pour initialiser une autre fentre (rfrence par une variable qui a le mme nom que la classe, ce qui ajoute de la confusion) dans laquel tu mets un autre panel 'celui sur lequel appeler :



```

```

----------

