2016-11-20 7 views
0

ノード間でドラッグジェスチャが実行されたときにノードを認識しようとしています。 MouseDragEventをnode#setOnMouseDragOverで設定しようとしましたが、呼び出されることはありません。JavaFX:ノードがドラッグされたときにノードが認識されない

これは私の実装です:

nfaNode.setOnMouseDragOver(event1 -> { 
       System.out.println("over " + nfaNode.getText().getText()); 
      }); 

enter image description here

私はそれが私がQ_0がQ_1にドラッグされていることを伝えることができていますように、Q_1が終わっドラッグされていることを知ってほしいです。

答えて

0

ドラッグジェスチャーの間、イベントはデフォルトでジェスチャーが開始されたノードにのみ配信されます。これを変更するには、onDragDetectedハンドラでstartFullDragに電話する必要があります。また、ノードを移動する場合、マウスイベントがドラッグされたノードにのみ配信されないようにするには、mousetransparenttrueに設定する必要があります。

@Override 
public void start(Stage primaryStage) { 
    Rectangle rect1 = new Rectangle(100, 100, Color.BLUE); 
    Rectangle rect2 = new Rectangle(200, 200, 100, 100); 
    rect2.setFill(Color.RED); 

    rect1.setOnDragDetected(evt -> { 
     rect1.startFullDrag(); 
    }); 

    rect2.setOnMouseDragOver(evt -> { 
     System.out.println("over"); 
    }); 

    Pane root = new Pane(rect1, rect2); 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

コメントアウトrect1.startFullDrag();とコンソール内の任意の出力が表示されないでしょう。

更新

あなたがドラッグジェスチャを開始したノードを取得し、イベントハンドラが追加されたノードを取得するためにgetSourceを使用するMouseDragEventからgestureSourceを取得することができます。例:

@Override 
public void start(Stage primaryStage) { 
    TextField text1 = new TextField(); 
    TextField text2 = new TextField(); 

    EventHandler<MouseEvent> dragDetected = evt -> ((Node) evt.getSource()).startFullDrag(); 
    EventHandler<MouseDragEvent> dragOver = evt -> { 
     System.out.println("over " + ((TextField) evt.getGestureSource()).getText()); 
    }; 

    EventHandler<MouseDragEvent> dragReleased = evt -> { 
     TextField target = (TextField) evt.getSource(); 
     TextField source = (TextField) evt.getGestureSource(); 
     if (source != target) { 
      target.setText(source.getText()); 
      source.clear(); 
     } 
    }; 

    for (TextField tf : Arrays.asList(text1, text2)) { 
     tf.setOnDragDetected(dragDetected); 
     tf.setOnMouseDragOver(dragOver); 
     tf.setOnMouseDragReleased(dragReleased); 
    } 

    VBox root = new VBox(text1, text2); 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

これは、 'nfaNode.setOnDragDetected(event1 - > nfaNode.startFullDrag());を使用してこれを試みました。 nfaNode.setOnMouseDragOver(event1 - > { System.out.println( "over" + "nfaNode.getText()。getText()); }); 'これまでに印刷されたのはQ_0だけです。私は明示的にnode1とnode2と書くことはできません。なぜなら、ペインに追加されたときはいつでも、これらのアクションをすべてのノードに追加するからです。 –

+0

@OrangeReceptacleは、ジェスチャソースとイベントオブジェクトを通じて使用可能なソースを使用します。 (答えを加えた例) – fabian

関連する問題