2016-09-04 1 views
0

J'ai un GridPane de cercles, et je veux être capable de faire glisser un cercle au-dessus d'un autre et d'appliquer la couleur du premier au second. Le problème que j'ai est que je ne peux pas obtenir le cercle de cible pour détecter un dragEntered ou dragOver. J'ai réussi à implémenter ceci avec succès en utilisant des étiquettes, mais pour une raison quelconque, un cercle ne donne pas le même effet.JavaFX Glisser et déposer une forme sur une autre forme

J'ai vu quelques quasi-solutions qui impliquaient la définition de circle.setMouseTransparent (true) de sorte que le noeud sous le noeud déplacé puisse voir le glisser, mais pas de chance ici non plus.

est ici un lien vers le code qui fait une chose similaire en utilisant les étiquettes: Hello Drag and Drop

Voici un extrait applicable de mon code:

   circle.setOnDragDetected(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent event) { 

        Dragboard db = circle.startDragAndDrop(TransferMode.ANY); 

        System.out.print("Dragging..."); 
        System.out.println("From row: " + draggedFromRow + " From col: " + draggedFromCol); 

        circle.setLayoutX(event.getSceneX()); 
        circle.setLayoutY(event.getSceneY()); 


        event.consume(); 
       } 
      }); 

      circle.setOnDragOver(new EventHandler <DragEvent>() { 

       public void handle(DragEvent event) { 
        System.out.println("onDragOver"); 

        event.acceptTransferModes(TransferMode.ANY); 

        event.consume(); 
       } 
      }); 


      circle.setOnDragDropped(new EventHandler<DragEvent>() { 
       @Override 
       public void handle(DragEvent event) { 

        int toCol = Integer.valueOf(circle.getId().substring(0, 1)); 
        int toRow = Integer.valueOf(circle.getId().substring(1)); 

        performSwap(draggedFromRow, draggedFromCol, toRow, toCol); 

        System.out.print("Dragg dropped on "); 
        System.out.println(toRow + " " + toCol); 

        event.consume(); 
       } 
      }); 

      circle.setOnDragEntered(new EventHandler<DragEvent>() { 
       public void handle(DragEvent event) { 
        System.out.println("drag entered!"); 

        event.consume(); 
       } 
      }); 


      circle.setOnDragExited(new EventHandler<DragEvent>() { 
       public void handle(DragEvent event) { 
        System.out.println("drag left!"); 

        event.consume(); 
       } 
      }); 
+0

S'il vous plaît poster un [MCVE] ou SSCCE qui reproduit le problème. Cela augmentera vos chances d'obtenir une réponse utile (et peut également vous aider à trouver le problème). – c0der

+0

Le glisser-déposer IIRC ne sera réellement lancé que si vous mettez des données dans le tableau. –

+0

James_D, ceci a résolu mon problème. Qui pourrait penser que vous avez besoin de cela là-bas, juste pour le faire enregistrer le glisser-déposer est en cours. Peut-être que j'ai juste manqué cela dans la documentation. Merci! –

Répondre

1

James_D avait la bonne réponse à ce problème dans son commentaire ci-dessus . Il semble que même pour que le cercle enregistre un glisser-déposer, vous devez transmettre certaines données à un Dragboard (même si vous ne voulez pas transmettre de données au nœud).

Cela a été ajouté à ma méthode circle.setOnDragDetected:

Dragboard db = circle.startDragAndDrop(TransferMode.ANY); 
ClipboardContent content = new ClipboardContent(); 
content.putString(circle.getId()); 
db.setContent(content); 

Ainsi, la méthode ressemble maintenant à ceci:

  circle.setOnDragDetected(new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent event) { 

        Dragboard db = circle.startDragAndDrop(TransferMode.ANY); 
        ClipboardContent content = new ClipboardContent(); 
        content.putString(circle.getId()); 
        db.setContent(content); 

        System.out.print("onDragDetected"); 

        event.consume(); 
       } 
      });