import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class DragAndDropTest extends Application {

    private static final boolean useWorkaround = false;

    @Override
    public void start(Stage stage) {

        final VBox root = new VBox(30);
        root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(root, 200, 300);

        final Text text = new Text(20, 20, "Drag me to the Rectangle");
        text.setOnDragDetected(event -> {
            Dragboard db = text.startDragAndDrop(TransferMode.COPY);
            ClipboardContent content = new ClipboardContent();
            content.putString("Done");
            db.setContent(content);
        });

        final Rectangle rectangle = new Rectangle(100, 100, Color.LIGHTGREEN);
        rectangle.setOnDragOver(event -> event.acceptTransferModes(TransferMode.COPY));
        rectangle.setOnDragDropped(event -> {
            StackPane dialogRoot = new StackPane(new Text(event.getDragboard().getString()));
            Scene dialogScene = new Scene(dialogRoot, 100, 30);
            Stage dialog = new Stage();
            dialog.setScene(dialogScene);
            if (useWorkaround) {
                dialog.setX(stage.getX() + scene.getX() + event.getSceneX());
                dialog.setY(stage.getY() + scene.getY() + event.getSceneY());
            } else {
                dialog.setX(event.getScreenX());
                dialog.setY(event.getScreenY());
            }
            dialog.show();
        });

        root.getChildren().addAll(text, rectangle);
        stage.setScene(scene);
        stage.show();
    }

}
