2016-11-17 5 views
2

ドラッグアンドドロップを実装したいノードがあります(このオブジェクトはターゲットではありません)。私はまた、オブジェクトがマウスカーソルと共に動くようにしたい。私はこれらの両方を行うことができましたが、同時にはできませんでした。ドラッグアンドドロップ操作中にコードを実行する方法は?

setOnDragDetectedsetOnMouseDraggedはよく機能しません。

import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.input.ClipboardContent; 
import javafx.scene.input.Dragboard; 
import javafx.scene.input.TransferMode; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class Example extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     Rectangle rect = new Rectangle(20, 20); 
     rect.setOnMousePressed(e -> System.out.println("Pressed")); 
     rect.setOnMouseDragged(e -> System.out.println("Dragged")); 
     rect.setOnDragDetected(e -> { 
      System.out.println("Detected"); 
      ClipboardContent content = new ClipboardContent(); 
      content.putString("something"); 
      Dragboard db = rect.startDragAndDrop(TransferMode.ANY); 
      db.setContent(content); 
     }); 
     Group subGroup = new Group(rect); 

     Scene scene = new Scene(subGroup, 100, 100); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 

     Example.launch(args); 
    } 
} 

ノード上でマウスを押して、マウスを移動します。これは出力です:

Pressed 
Dragged 
Dragged 
Dragged 
Dragged 
Dragged 
Dragged 
Detected 

ドラッグが検出されると、MouseDraggedハンドラが停止します。

私はどのように記述したのですか?私が気づいたことは、おそらく私は親のためにonDragOverを使用することができましたが、それは本当にすべきであるので、ノード内の動作を望みます。

+0

この現象はまったくありません。ドラッグジェスチャが検出された後、onMouseDraggedハンドラは報告を続けます。質問を含めるには[MCVE]と[編集]を作成する必要があります。 –

+0

@James_D申し訳ありません。ここにコードがあります。それは私が思うドラッグボードと関係がある。 – Mark

答えて

0

ここでは2つのものを混在させています。要するに、startDragAndDropメソッドを呼び出すと、システムはドラッグアンドドロップモードに切り替わり、JavaはMouseEventrectの配信を停止します。

MouseEvent documentationには、3種類のドラッグジェスチャーを説明するセクション「ドラッグジェスチャー」があります。

  • 単純なpress-drag-release - ドラッグが検出されると、Javaは引き続きドラッグが検出されたノードにMouseEventsを配信します。
  • フル・プレス・ドラッグ・リリース - setOnDragDetectedで設定したハンドラ内でstartFullDragを呼び出すことができます。その後、JavaもMouseDragEventsを他のノード(潜在的なジェスチャーターゲット)に配信し始めます。
  • プラットフォームでサポートされているドラッグ&ドロップ - OnDragDetectedハンドラ内でstartDragAndDropを呼び出した場合、JavaはMouseEventsの配信を停止し、代わりにDragEventsの配信を開始します。これは、他のアプリケーションとのドラッグ&ドロップ操作に使用されます。

達成したいことはわかりませんが、アプリケーションの外にドラッグしたくない場合は、startFullDragを代わりに使用してみてください。

また、DragEventMouseDragEventのドキュメントを詳しく見ると役立つ場合があります。

+0

私のアプリケーション内でイベントだけが必要です。 'startFullDrag'を使用すると、ターゲットノードは' OnDragEntered'に反応せず、終了します。何かがドラッグアンドドロップ操作が起こっていることを確認する必要がありますが、そのスペースに出入りし、コンテンツに応じて反応します - それが有効であるかどうか。これは 'startDragAndDrop'だけでできます。 – Mark

+0

@マークもし 'startFullDrag'を使うと、' OnDragEntered'ではなく 'OnMouseDragEntered'ハンドラをターゲット上に設定する必要があります。 – FelixRabe

+0

はい、マウスドラッグハンドラの機能はD&Dハンドラとは異なります。 'OnDragDone'はドラッグ終了時にソース上で何かをすることを許しますが、" onMouseDragDone "のようなものはありません。また、D&Dのようにドロップターゲットが有効かどうかを示すために、マウスポインタが変更されません。 – Mark

関連する問題