JavaFX Drag & Drop

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;
    }
}

おすすめ

転載: blog.csdn.net/weiweiqiao/article/details/132720231