Bonjour,
Je suis en train d'essayer d'implémenter le drag'n drop qu'on trouve sur http://gfx.developpez.com/tutoriel/java/swing/drag/ et qui utilise un GhostGlassPane pour faire quelque chose de plutôt joli/intuitif visuellement. Sauf que je ne m'en sors pas malgré les explications.
Voici une description de mon appli (copie d'écran en pièce jointe).
Un écran swing avec :
- à gauche : le dessin d'une silhouette humaine et comprenant 4 ronds qui servent à indiquer le matériel porté sur la tête (casque par exemple), sur le corps (une armure par exemple) et aux deux mains (une épée, une hache ...)
- à droite : un tableau listant l'équipement disponible (sous forme d'images)
- On peut drag'n dropper un équipement du tableau vers un des 4 ronds de la silhouette humaine. En faisant cela, l'image de l'équipement choisi apparait dans le rond.
J'ai réussi à implémenter une partie puisque j'ai bien le drag qui s'active avec l'image de l'équipement qui suit la souris, c'est ce qu'on voit dans la pièce jointe avec une hache que j'ai glisser depuis le tableau jusqu'à la main gauche.
Par contre le drop ne fonctionne pas correctement : il s'active à n'importe quel endroit où je droppe alors que je veux qu'il ne fonctionne que sur les 4 ronds de la silhouette et qu'en plus il ne s'active que pour le 4 du drop. Or actuellement non seulement il droppe n'importe où mais en plus il ne détecte pas le composant sur lequel il droppe (même quand je droppe au dessus d'un rond).
Merci d'avance pour votre aide
Voici une version simplifiée de mon code :
// Toutes les classes de http://gfx.developpez.com/tutoriel/java/swing/drag/
GhostPictureAdapter ...
GhostGlassPane ...
GhostDropAdapter ...
...
// SlotEquipement
// Composant swing personnalisé
// => Dessine un rond avec l'image de l'équipement porté si il y en a un
// FichePersonnage
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 public class SlotEquipement extends JComponent { private Image image; public SlotEquipement() { super(); this.image = null; } public SlotEquipement(Image image) { super(); this.image = image; } public void setImage(Image image) { this.image = image; } @Override public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // ---------------------------------------- // DESSINER LE ROND // ---------------------------------------- g2d.setColor(Color.BLACK); g2d.drawOval(0, 0, 60, 60); g2d.setColor(new Color(10, 10, 10, 15)); g2d.fillOval(0, 0, 60, 60); // ---------------------------------------- // DESSINER L'IMAGE // ---------------------------------------- if(image!=null) g2d.drawImage(image, 5, 5, null); } }
// La classe affichant la fenêtre swing et son contenu (silhouette humaine, ronds de l'équipement porté, tableau de l'équipement disponible)
// Je ne mets pas dans le code la gestion du positionnement des objets swing (pas de layout ...) car ça n'a pas de rapport avec le pb
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public class FichePersonnage extends JInternalFrame { private JPanel panel; private GhostGlassPane glassPane; private GhostDropListener listenerTete; private GhostDropListener listenerCorps; private GhostDropListener listenerMainGauche; private GhostDropListener listenerMainDroite; private Personnage personnage; public FichePerso(Personnage personnage) { this.personnage = personnage; glassPane = new GhostGlassPane( ); setGlassPane(glassPane); ... afficheSilhouette(); afficheTableau(); ... } // Affiche la silhouette et les ronds d'équipement // Pour chaque rond, on lui affecte un "listener de drop" public void afficheSilhouette() { // Ajout de la silhouette JLabel lbSilhouette = new JLabel(new ImageIcon("silhouette.jpg"); panel.add(lbSilhouette); // Ajout du slot d'équipement pour la tête SlotEquipement slotTete = new SlotEquipement(); panel.add(slotTete); listenerTete = new GhostDropManager(slotTete); // Ajout du slot d'équipement pour le corps SlotEquipement slotCorps = new SlotEquipement(); panel.add(slotCorps); listenerCorps = new GhostDropManager(slotCorps); // Ajout du slot d'équipement pour la main gauche SlotEquipement slotMainGauche= new SlotEquipement(); panel.add(slotMainGauche); listenerMainGauche = new GhostDropManager(slotMainGauche); // Ajout du slot d'équipement pour la main droite SlotEquipement slotMainDroite= new SlotEquipement(); panel.add(slotMainDroite); listenerMainDroite = new GhostDropManager(slotMainDroite); } // Affiche le tableau avec les équipements disponibles// // chaque équipement est représenté par son image (jlabel) // Pour chaque équipement, on créé un mouse adapter qui affichera l'image en cours de drag'n drop. Et on ajoute les listener de drop des 4 ronds de la silhouette. public void afficheTableau() { JPanel panelTableau = new JPanel(); for(Equipement equip:personnage.getListeEquip()) { JLabel lbBien = new JLabel(equip.getImage()); panelTableau.add(lbBien); GhostDropAdapter pictureAdapter = new GhostPictureAdapter(glassPane, equip.getNom(), equip.getImage()); pictureAdapter.addGhostDropListener(listenerTete); pictureAdapter.addGhostDropListener(listenerCorps); pictureAdapter.addGhostDropListener(listenerMainGauche); pictureAdapter.addGhostDropListener(listenerMainDroite); lbBien.addMouseListener(pictureAdapter); lbBien.addMouseMotionListener(new GhostMotionAdapter(glassPane)); } panel.add(panelTableau); } }
Partager