Mit der JavaFX- Drag-and-Drop- Unterstützung können Sie Ihre JavaFX-Anwendungen so entwerfen, dass Benutzer JavaFX-Knoten (Steuerelemente) auf andere JavaFX-Knoten ziehen können und Ihre Anwendung auf diese Drag-and-Drop-Ereignisse warten und darauf reagieren kann. Drag-and-Drop kann nützlich sein, um Benutzern die Möglichkeit zu geben, Aktionen einfacher festzulegen, wenn dies sinnvoll ist – z. B. beim Ziehen von Dateien an neue Speicherorte oder beim Verschieben von Daten in Analysevorgänge usw.
Übrigens ist die JavaFX-Drag-and-Drop-Unterstützung der HTML5-Drag-and-Drop-Unterstützung ziemlich ähnlich . Wenn Sie bereits mit der Drag-and-Drop-Funktionalität von HTML5 (über JavaScript) vertraut sind, ist es einfacher zu verstehen, wie die Drag-and-Drop-Funktionalität von JavaFX funktioniert. Wenn nicht, starten Sie einfach direkt mit der JavaFX-Drag-and-Drop-Unterstützung.
Drop-Quelle und Drop-Ziel
Die JavaFX-Drag-and-Drop-Unterstützung unterteilt die beim Drag-and-Drop beteiligten JavaFX-Steuerelemente in die Kategorien Drag-Quellen und Drop-Ziele .
Eine Drag-Quelle ist ein JavaFX-Steuerelement (z. B. eine 2D-Form , ImageView usw.), das auf einen anderen Knoten gezogen werden kann. Im Allgemeinen können die meisten JavaFX-Steuerelemente als Drag-Quellen verwendet werden.
Ein Drop-Ziel ist ein JavaFX-Steuerelement, auf das Sie eine Drag-Source ziehen und dann dort ablegen können. Wenn die Drag-Quelle auf dem Drop-Ziel abgelegt wird, wird ein Ereignis ausgelöst, auf das Ihre Anwendung warten und darauf reagieren kann.
JavaFX-Drag-and-Drop-Beispiel
Hier ist ein JavaFX-Drag-and-Drop-Beispiel, das zeigt, wie man einen 2D-Kreis in eine Drag-Quelle und einen anderen 2D-Kreis in ein Drop-Ziel umwandelt:
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.*;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class DragAndDropExample extends Application {
public static void main(String[] args) {
launch(args);
}
public void start(Stage primaryStage) {
Circle circle = createCircle("#ff00ff", "#ff88ff",100);
circle.setOnDragDetected((MouseEvent event) -> {
System.out.println("Circle 1 drag detected");
Dragboard db = circle.startDragAndDrop(TransferMode.ANY);
ClipboardContent content = new ClipboardContent();
content.putString("Circle source text");
db.setContent(content);
});
circle.setOnMouseDragged((MouseEvent event) -> {
event.setDragDetect(true);
});
Circle circle2 = createCircle("#00ffff", "#88ffff",300);
circle2.setOnDragOver(new EventHandler<DragEvent>() {
public void handle(DragEvent event) {
if (event.getGestureSource() != circle2 && event.getDragboard().hasString()) {
event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
}
event.consume();
}
});
circle2.setOnDragDropped((DragEvent event) -> {
Dragboard db = event.getDragboard();
if (db.hasString()) {
System.out.println("Dropped: " + db.getString());
event.setDropCompleted(true);
} else {
event.setDropCompleted(false);
}
event.consume();
});
Pane pane = new Pane();
pane.getChildren().add(circle);
pane.getChildren().add(circle2);
Scene scene = new Scene(pane, 1024, 800, true);
primaryStage.setScene(scene);
primaryStage.setTitle("2D Example");
primaryStage.show();
}
private Circle createCircle(String strokeColor, String fillColor, double x) {
Circle circle = new Circle();
circle.setCenterX(x);
circle.setCenterY(200);
circle.setRadius(50);
circle.setStroke(Color.valueOf(strokeColor));
circle.setStrokeWidth(5);
circle.setFill(Color.valueOf(fillColor));
return circle;
}
}