ドラッグジェスチャーの間、イベントはデフォルトでジェスチャーが開始されたノードにのみ配信されます。これを変更するには、onDragDetected
ハンドラでstartFullDrag
に電話する必要があります。また、ノードを移動する場合、マウスイベントがドラッグされたノードにのみ配信されないようにするには、mousetransparent
をtrue
に設定する必要があります。
例
@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();
}
これは、 'nfaNode.setOnDragDetected(event1 - > nfaNode.startFullDrag());を使用してこれを試みました。 nfaNode.setOnMouseDragOver(event1 - > { System.out.println( "over" + "nfaNode.getText()。getText()); }); 'これまでに印刷されたのはQ_0だけです。私は明示的にnode1とnode2と書くことはできません。なぜなら、ペインに追加されたときはいつでも、これらのアクションをすべてのノードに追加するからです。 –
@OrangeReceptacleは、ジェスチャソースとイベントオブジェクトを通じて使用可能なソースを使用します。 (答えを加えた例) – fabian