Bonsoir à tous, j'ai l'impression d'avoir écumé les forums avant de me décider à poster ici mais je n'ai rien trouvé de concret et les exemples que j'ai récupéré étaient soit trop complexe pour ce que je veux faire soit ils ne collaient pas du tout. En tout cas j’espère ne pas faire doublon avec mon problème. Sinon désolé, merci de me l'indiquer.
Donc comme le titre du sujet l'indique, je travail en ce moment sur une partie d'un jeu (en Java bien sur) ou on doit déplacer des images (dans des JLabel) sur d'autres images. Le but étant de les placer sur les bons endroits. J'ai donc deux ArrayList d'images, un JPanel (GridBagLayout) qui contient les images à deplacer et un autre avec les images cibles.
Pour simplifier l'idée, on pourrait voir ça comme le jeu pour tout-petits ou il faut mettre les objets carrés dans les trous carrés, les ronds dans les ronds, etc, etc. Ça n'a rien à voir mais le concept est là.
Donc pour le moment je me retrouve avec un double problème au moment de déposer la 1ere image sur la 2ème :
* Tout d'abord, je pense que mon drag est bon (même si il me semble faible voir ridicule mais bon...) mais c'est pour le drop que ça coince, je ne vois pas comment délimiter sur quels images le drop est accepté (toutes les images de doivent pas être des targets) et comment récupérer l'information.
* Ensuite, c'est pour la superposition des images au moment du drop. La seule chose que j'ai réussi à faire pour l'instant, c'est remplacer une image par une autre. J'ai lu qu’apparemment les JLayeredPane seraient fait pour mais je ne vois pas trop comme les lier avec mon GridBagLayout.
Voilà différents bouts de mon code pour vous donner une idée :
- Les images cibles :
- Les images à deplacer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 JPanel s = new PanelImage("imagesDe Fond.jpg");{ s.setLayout(new GridBagLayout());{ for (int i = 0; i < SIZE; i++) { Image image = ImageIO.read(new File("imageCible.png"));//Les images cibles sont visuellement toutes les memes DropTargetHouse img = new DropTargetHouse(new ImageIcon(image)); s.add(img, new GBC(i, 0, 1, 1).weight(1, 0)); } s.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); s.setPreferredSize(new Dimension(323, 318)); }
- La class Draggable (récupérée sur un autre forum et légèrement retouché) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 s = new JPanel(new GridBagLayout());{ for (int i = 0; i < board.getFigures().size(); i++) { DraggableLabel img = new DraggableLabel(list.get(i));//liste des images à deplacer s.add(img, new GBC(i, 0, 1, 1).weight(1, 0)); } s.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED)); s.setPreferredSize(new java.awt.Dimension(400, 200)); }
- Et enfin la class DoopTarget (de même que pour Draggable) :
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 public static class DraggableLabel extends JLabel implements DragGestureListener, DragSourceListener { private static final DataFlavor DATA_FLAVOUR = new DataFlavor(Icon.class, ""); DragSource dragSource; public DraggableLabel(Icon icon) { setIcon(icon); dragSource = new DragSource(); dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE, this); } public void dragGestureRecognized(DragGestureEvent evt) { Transferable transferable = new Transferable() { public boolean isDataFlavorSupported(DataFlavor d) { return d.equals(DATA_FLAVOUR); } public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] {DATA_FLAVOUR}; } public Object getTransferData(DataFlavor arg0) throws UnsupportedFlavorException, IOException { return null; } }; dragSource.startDrag(evt, DragSource.DefaultCopyDrop, transferable, this); } public void dragEnter(DragSourceDragEvent evt) { System.out.println("Drag enter"); } public void dragOver(DragSourceDragEvent evt) { System.out.println("Drag over"); } public void dragExit(DragSourceEvent evt) { System.out.println("Drag exit"); } public void dropActionChanged(DragSourceDragEvent evt) { System.out.println("Drag action changed"); } public void dragDropEnd(DragSourceDropEvent evt) { System.out.println("Drag action End"); } }
Donc voilà, si vous avez réussi à lire jusqu'ici et si vous avez des constatations, des idées, des critiques, des questions ou autre, je suis preneur parce que là j'ai l'impression de faire du sur place depuis un petit moment.
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 public static class DropTarget extends JLabel implements DropTargetListener { public DropTargetHouse(Icon icon) { setIcon(icon); new DropTarget(this, this); } public void dragEnter(DropTargetDragEvent evt) { System.out.println("Drop enter"); } public void dragOver(DropTargetDragEvent evt) { System.out.println("Drop over"); } public void dragExit(DropTargetEvent evt) { System.out.println("Drop exit"); } public void dropActionChanged(DropTargetDragEvent evt) { System.out.println("Drop action changed"); } public void drop(DropTargetDropEvent evt) { try { Transferable transferable = evt.getTransferable(); if (transferable.isDataFlavorSupported(DataFlavor.imageFlavor)) { //J'ignore encore quoi mettre ici } else { evt.rejectDrop(); } } catch (IOException e) { evt.rejectDrop(); } catch (UnsupportedFlavorException e) { evt.rejectDrop(); } } }
Merci d'avance pour votre aide.
Partager