或有三种类型的拖动手势。它们都是由鼠标新闻事件启动的,并由于释放的鼠标释放事件而终止,源节点决定要进行哪些手势。 简单的压力释放手势是默认的。它最好用于更改形状的尺寸,将其拖动等等。将整个压力释放的手势传递到一个节点。按下鼠标按钮时,选择了最高的节点,然后将所有随后的鼠标事件传递到同一节点,直到释放按钮为止。如果从这些事件中生成鼠标单击事件,则仍将其传递到同一节点。
为简单的新闻释放手势,其他节点不参与,也没有得到任何事件。如果这些节点需要参与手势,则必须激活全压力释放的手势。这种手势最适合通过“电线”连接节点,将节点拖动到其他节点等。这种手势类型在上更仔细地描述,其中包含传递给手势目标的事件。
MouseDragEvent
第三种手势类型是平台支持的拖放手势。它最适合传输数据并在(不一定是FX)应用程序之间工作。这种手势类型在
DragEvent
中更加紧密地描述。
在简短的摘要中,当按下鼠标按钮并将所有MouseEvent
交付到手势源时,自动激活了简单的压力释放手势。当您开始拖动时,最终
DRAG_DETECTED
事件到达。在其处理程序中,您可以通过在节点或场景上调用startFullDrag
方法来启动完整的压力释放手势 -
MouseDragEvent
开始传递给手势目标,也可以通过调用开始拖动手势。startDragAndDrop
节点或场景上的方法 - 系统切换到拖放模式,并且开始传递而不是DragEvent
S。如果您不调用这些方法中的任何一种,那么简单的压力释放手势仍在继续。[...]如果我正确理解您的问题,您希望能够将鼠标拖到多个节点上,并让它们做出反应,这是一个手势。您需要使用按拖纸释放的手势来实现这一目标。如有记录,您必须聆听MouseEvent
事件并致电
DRAG_DETECTED
Node#startFullDrag()
激活
fullPress-Drag-Release手势。然后,UI中的每个“正方形”都需要聆听
Scene#startFullDrag()
事件。请注意,事件类型为MOUSE_DRAG_ENTERED
和not。 这里是一个例子:
MOUSE_DRAG_ENTERED
上面通过在根上设置
MOUSE_ENTERED
属性来聆听事件。请注意,如果您开始拖动其中一个,则该事件将起泡到根,并由上述处理程序处理。另外,由于您明确提及left鼠标按钮,因此添加了检查鼠标按钮是否为主要按钮。
然后每个
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) {
GridPane root = new GridPane();
root.setPadding(new Insets(2));
root.setVgap(2);
root.setHgap(2);
// start full press-drag-release gesture
root.setOnDragDetected(
event -> {
if (event.getButton() == MouseButton.PRIMARY) {
event.consume();
root.startFullDrag();
}
});
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
Rectangle rect = new Rectangle(50, 50, Color.WHITE);
rect.setStroke(Color.BLACK);
root.add(rect, i, j);
// detect MOUSE_DRAG_ENTERED events
rect.setOnMouseDragEntered(
event -> {
event.consume();
rect.setFill(Color.BLACK);
});
}
}
primaryStage.setTitle("MouseDragEvent Example");
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
通过设置DRAG_DETECTED
属性设置来聆听Node#onDragDetected
事件。这些事件只有在有生效的手势时才提供这些事件。