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

AWT/Swing Java Discussion :

Drag and Drop : java.awt.dnd.InvalidDnDOperationException


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut Drag and Drop : java.awt.dnd.InvalidDnDOperationException
    Bonjour,

    Je participe à un projet dans lequel le Drag and Drop est une des fonctionnalités importante.

    Tout fonctionne correctement à une exception prêt :
    Lorsque je sélectionne un objet à draguer et que je le déplace très rapidement sur une zone non "droppable" et que je le relache, les méthodes dragExit sont bien exécutées mais pas la méthode dragDropEnd. Du coup le mécanisme de drag and drop n'est pas complété et lorsque je réessaie de draguer un objet j'obtiens l'exception suivante :

    dragGestureRecognized - java.awt.dnd.InvalidDnDOperationException: Drag and drop in progress

    Du coup, je voudrai savoir s'il est possible d'éviter ça ou s'il est possible de "réinitialiser" le drag and drop si l'exception est interceptée.

    Par avance merci,

    Barjovial

  2. #2
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    En fait le problème se pose également lorsque je drop l'élément sur un zone droppable.

    En gros le problème est le suivant :
    dans la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    drop(DropTargetDropEvent dtde)
    je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dtde.acceptDrop(dtde.getDropAction());
    dtde.dropComplete(true);
    Et de ce que j'ai compris, le dropComplete notifie la drag source de la fin du drag and drop et la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void dragDropEnd(DragSourceDropEvent dsde)
    de la drag source est exécutée.

    Le problème c'est que, de temps en temps, le drop est bien réalisé mais la méthode dragDropEnd n'est pas appelée. Du coup tout le mécanisme de drag and drop se retrouve en vrac et je ,n'arrive pas non plus à le réinitialiser (si jamais c'est faisable). Et je n'arrive pas à reproduire l'anomalie de façon précise.

    Bref si quelqu'un avait une idée de comment résoudre ça ...

    Merci,


    Barjovial

  3. #3
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    Bonjour,

    J'ai continué de chercher sans vraiment trouver de solution.
    Voici des extraits du code que j'utilise, si ça peut aider ...

    Le composant qui est draggué :
    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
    public class JIComponent extends JComponent implements DragGestureListener{
     
    	[...]
    	private DragSource dragSource;
    	private LambdaComponent lambdaParent;
     
    	public JIComponent(){
    		[...]
    		dragSource = DragSource.getDefaultDragSource();
    		dragSource.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_MOVE, this);
    	}
     
     
    	@Override
    	public void dragGestureRecognized(DragGestureEvent dge) {
    		if (dge.getDragAction()==DnDConstants.ACTION_MOVE){
    			TransferableJIComponent mct = new TransferableJIComponent(this);
    			try{
    				dragSource.startDrag(dge, DragSource.DefaultMoveDrop, mct, this.getLambdaParent());
    			}catch (java.awt.dnd.InvalidDnDOperationException e){
    				LOG.debug("dragGestureRecognized - "+e);
    			}
    			return;
    		}		
    	}
    }
    et le panel qui est utilisé comme dragSource et dropTarget :

    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
    public class LambdaComponent extends JPanel implements DropTargetListener, DragSourceListener{
    	private DropTarget dropTarget;
     
    	public LambdaComponent() {
    		dropTarget = new DropTarget(this,this);
    		this.setDropTarget(dropTarget);
    		this.dropTarget.setActive(true);
    	}
     
    	@Override
    	public void drop(DropTargetDropEvent dtde) {
    		dtde.getDropAction();
    		JIComponent jiCompDnD;
    		try {
    			jiCompDnD = (JIComponent) dtde.getTransferable().getTransferData(TransferableJIComponent.mdf);
    			Point p = dtde.getLocation();
    			Date dropDate = new Date(jiCompDnD.getUsefullToCalculateDate());
     
    			if (dropDate.before(aCertainDate) {
    				dtde.rejectDrop();
    				dtde.dropComplete(true);
    			}else{
    				dtde.acceptDrop(dtde.getDropAction());
    				dtde.dropComplete(true);
    				[...]
    			}
    		} catch (UnsupportedFlavorException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
     
    	@Override
    	public void dragDropEnd(DragSourceDropEvent dsde) {
    		if (dsde.getDropSuccess()){
    			try {
    				JIComponent jiDnD = 
    				(JIComponent)dsde.getDragSourceContext().getTransferable().getTransferData(TransferableJIComponent.mdf);
    				[...]
    			} catch (UnsupportedFlavorException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    Le problème étant toujours que la méthode est correctement exécutée mais que de temps en temps (et je n'arrive pas à déterminer les causes exactes), la méthode dragDropEnd n'est pas appelée.

  4. #4
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    Personne n'a jamais rencontré ce problème ?

  5. #5
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    Bonjour,

    J'ai enfin trouvé d'où venait le problème.

    En fait, j'utilise un glassPane pour afficher une image transparente lors du drag du composant. Et dans ce glassPane j'utilisais la méthode paintImmediatly pour repeindre l'image. En remplaçant paintImmediatly par la méthode repaint, le problème n'apparaît plus.

    J'ai pas trop le temps de chercher une explication, certainement un problème de préemption... Si jamais quelqu'un avait une idée je suis preneur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Drag and Drop en Java
    Par rahoubaa dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 04/04/2011, 14h15
  2. DRAG AND DROP - JAVA
    Par pachalcs dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 10/12/2010, 11h49
  3. java drag and drop
    Par Bouali_Ali dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 23/11/2010, 23h51
  4. Drag and drop Java
    Par francois.p dans le forum Langage
    Réponses: 1
    Dernier message: 12/04/2010, 16h30
  5. Drag and Drop Java SE 6
    Par ganga dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 28/08/2007, 15h35

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