IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

Drag & Drop avec superposition d'images


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut Drag & Drop avec superposition d'images
    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 :
    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));
    }
    - Les images à deplacer :
    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));
    }
    - 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
    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");
      }
    }
    - 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
     
    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();
            }
        }
    }
    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.

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Par défaut
    salut j'avait deja fait un jeu et j'ai deja fait un drag and drop.
    j'avait mit une grille de button,
    voila la doc qui explique bien ce truc
    http://docs.oracle.com/javase/tutori...erhandler.html

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    Merci pour ta réponse si rapide. J'ai en effet essayer avec une liste de JButton et en effet ça aide pas mal. Je peux ainsi mettre des actionListener sur mes cibles.
    J'ai également simplifier mon problème de superposition d'images en les mettant directement en images de fond plutôt que les ajouter par dessus le JPanel.
    Ça n'est pas la meilleur méthode c'est sur vu que quand j'agrandis la fenêtre les JButton restent à la même taille alors que l'image de fond s'agrandit et donc les images cibles avec mais au moins je n'ai plus à gérer la superposition.

    Par contre j'ai toujours mon problème de drag & drop.
    J'ai en effet rajouter un setTransfertHandler sur mes JButton (ceux qui contiennent les images à dragger et les cibles) mais une fois déplacer dans les cibles :
    - les images de départ restent dans leur JButton
    - j'ai bien l'image que je veux dans les JButton cibles mais une fois à l’intérieur je ne peux plus la récupérer pour la re-dragger éventuellement
    - je peux écraser une de mes images de départ en draggant une autre dessus alors que je ne veux pas que ça soit possible

    Bref, j'me rend compte j'ai vraiment du mal à appréhender le drag & drop malgré mes lectures de doc et d'exemples en boucle et donc je me retrouve coincé sur quelque chose qui n'est pas forcement évident quand on débute mais qui je sais est largement faisable quand on maitrise un peu.
    Donc toute aide est toujours la bienvenue, merci d'avance

Discussions similaires

  1. Drag and Drop avec image.
    Par tchize_ dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 29/09/2013, 22h53
  2. Drag'N'Drop avec GhostGlassPane (image fixe)
    Par arnaud.tlse dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 19/08/2011, 08h50
  3. Drag and drop avec image pendant le drag
    Par WG614 dans le forum VB.NET
    Réponses: 2
    Dernier message: 06/03/2009, 06h17
  4. [SWT/JFACE] Drag and drop avec une image sur le curseur
    Par soft-war dans le forum SWT/JFace
    Réponses: 5
    Dernier message: 30/07/2008, 13h01
  5. Réponses: 6
    Dernier message: 18/12/2007, 09h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo