2016-09-04 16 views
0

サークルのグリッドペインがあり、別のサークルの上に1つのサークルをドラッグし、最初のサークルの色を2番目のサークルに適用したいと考えています。JavaFXシェイプを別のシェイプにドラッグアンドドロップする

問題は、私がdragEnteredまたはdragOverを検出するターゲットサークルを取得できないことです。私はこれをLabelsを使ってうまく実装することができましたが、何らかの理由でCircleが同じ効果を与えない。

ノードの下にドラッグされたノードがドラッグを表示できるようにcircle.setMouseTransparent(true)を設定することを含むいくつかの準解決法が見られましたが、ここでも運がありません。ここで

は、ラベルを使用して同じようなことを行うコードへのリンクです:Hello Drag and Drop

は、ここに私のコードの適用抜粋です:

   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

を問題を再現[MCVE]またはSSCCEを投稿してください。 これにより、役に立つ回答が得られる可能性が高くなります(問題の発見に役立つ場合もあります)。 – c0der

+0

ドラッグボードにデータを入れない限り、IIRCのドラッグアンドドロップは実際には開始されません。 –

+0

James_D、これは私の問題を解決しました。ドラッグ・アンド・ドロップが起こっていることを登録させるには、そこにそれが必要だと誰が思うでしょう。たぶん私はドキュメントでそれを見逃してしまったでしょう。ありがとう! –

答えて

1

James_Dは、上記の彼のコメントで、この問題に対する正しい答えを持っていました。ドラッグ・アンド・ドロップが発生しているサークル・レジスタを持っているだけでも、データをドラッグ・ボードに渡す必要があります(ノードにデータを渡したくない場合でも)。

これは私のcircle.setOnDragDetected方法に追加されました:だから方法は次のようになります

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

  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(); 
       } 
      }); 
関連する問題