2016-10-16 8 views
0

onDragOverイベントが次の例で発生しないのはなぜですか?onDragOverが発生しない(JavaFXで)

最も簡単なドラッグビヘイビアを実装する方法、つまりクリップボードのものを使用しないでください。

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.geometry.*; 
import javafx.scene.Scene; 
import javafx.scene.input.DragEvent; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Background; 
import javafx.scene.layout.BackgroundFill; 
import javafx.scene.layout.CornerRadii; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.*; 
import javafx.stage.Stage; 

public class DragTry extends Application { 

    private Point2D dragVector = null; 

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

     Pane root = new Pane(); 

     Pane node = new Pane(); 
     node.setBackground(new Background(new BackgroundFill(Color.BLUE, CornerRadii.EMPTY, javafx.geometry.Insets.EMPTY))); 
     node.setPrefWidth(100); 
     node.setPrefHeight(50); 
     node.setTranslateX(200); 
     node.setTranslateY(200); 

     node.setOnDragDetected(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      System.out.println("odDragDetected"); 

      double x = event.getX(); 
      double y = event.getY(); 
      x -= node.getTranslateX(); 
      y -= node.getTranslateY(); 
      dragVector = new Point2D(x, y); 
      node.startFullDrag(); 
     } 
     }); 

     node.setOnDragOver(new EventHandler<DragEvent>() { 
     @Override 
     public void handle(DragEvent event) { 
      System.out.println("onDragOver"); 

      double x = event.getX(); 
      double y = event.getY(); 
      x += dragVector.getX(); 
      y += dragVector.getY(); 
      node.setTranslateX(x); 
      node.setTranslateY(y); 
     } 
     }); 

     node.setOnDragDone(new EventHandler<DragEvent>() { 
     @Override 
     public void handle(DragEvent event) { 
      dragVector = null; 
     } 
     }); 

     root.getChildren().add(node); 

     Scene scene = new Scene(root, 800, 600); 

     primaryStage.setScene(scene); 
     primaryStage.setTitle("DragTry"); 
     primaryStage.show(); 
    } 


    public static void main(String[] args) { 
     DragTry.launch(args); 
    } 
} 

答えて

1

onDragXYZイベントは、クリップボード、ドラッグイベントのために、次のとおりです。また、1つの迷惑なドラッグの一部とドロップAPIを使用すると、dragboardに何かを追加しない限り、そのドラッグが活性化されていないです。他の種類のドラッグの場合は&ドロップ機能のため、代わりにイベントを使用する必要があります。さらに、Nodeの座標系で座標を使用しない方が良いでしょう。

node.setOnDragDetected(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent event) { 
     System.out.println("odDragDetected"); 

     double x = event.getX(); 
     double y = event.getY(); 
     dragVector = node.localToParent(x, y).subtract(node.getTranslateX(), node.getTranslateY()); 
     node.startFullDrag(); 
    } 
}); 

node.setOnMouseDragOver(new EventHandler<MouseDragEvent>() { 
    @Override 
    public void handle(MouseDragEvent event) { 
     System.out.println("onDragOver"); 

     Point2D parentCoords = node.localToParent(event.getX(), event.getY()); 

     node.setTranslateX(parentCoords.getX() -dragVector.getX()); 
     node.setTranslateY(parentCoords.getY() -dragVector.getY()); 
    } 
}); 

node.setOnMouseReleased(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent event) { 
     dragVector = null; 
    } 
}); 

ただし、ノードが1つのみであるため、ドラッグイベントを使用する必要はありません。 onMouseDragOverの代わりにonDragDetectedonMouseDraggedの代わりにonMousePressedを使用すると簡単です。

+0

「startFullDrag」は必要ありません。 – Dims

+0

@Dims完全ドラッグモードでは、ドラッグが開始されたノード以外のノードにマウスイベントが配信されます。 3つの異なるドラッグモードがあります。それぞれの操作方法については、['MouseEvent' documentation(http://docs.oracle.com/javase/8/javafx/api/javafx/scene/input/MouseEvent.html)を参照してください。 1つは働く;簡単に言えば、 'startFullDrag()'または 'startDragAndDrop()'はそれぞれ非デフォルトモードの1つを選択します。 –

1

まず、あなたの代わりにstartFullDragの、startDragAndDropを呼び出す必要があります。異なるドラッグモードは、documentation for MouseEventに記載されています。

node.setOnDragDetected(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent event) { 
     System.out.println("odDragDetected"); 

     double x = event.getX(); 
     double y = event.getY(); 
     x -= node.getTranslateX(); 
     y -= node.getTranslateY(); 
     dragVector = new Point2D(x, y); 

     Dragboard db = node.startDragAndDrop(TransferMode.COPY_OR_MOVE); 
     ClipboardContent cc = new ClipboardContent(); 
     cc.putString("Something"); 
     db.setContent(cc); 
    } 
    }); 
関連する問題