import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.Scene;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.stage.StageStyle;


public class DragUndecoratedStage extends Application {

    boolean dragInProgress = false;
    double winStartX;
    double winStartY;
    double dragStartX;
    double dragStartY;

    @Override public void start(Stage stage) {
        stage.initStyle(StageStyle.UNDECORATED);

        Group root = new Group();
        Scene scene = new Scene(root, 600, 450);
        scene.setFill(Color.LIGHTGREEN);

        Rectangle rect = new Rectangle();
        rect.setX(25);
        rect.setY(40);
        rect.setWidth(100);
        rect.setHeight(50);
        rect.setFill(Color.RED);

        root.getChildren().add(rect);
        stage.setScene(scene);
        stage.show();

        EventHandler<MouseEvent> mouseHandler = e -> {
            if (e.getEventType() == MouseEvent.MOUSE_PRESSED) {
                if (e.getButton() == MouseButton.PRIMARY) {
                    dragInProgress = true;
                    winStartX = stage.getX();
                    winStartY = stage.getY();
                    dragStartX = e.getScreenX();
                    dragStartY = e.getScreenY();
//                    System.err.println("DragDetected: " +
//                            "dragStart: " + dragStartX + ", " + dragStartY +
//                            ";  winStart: " + winStartX + ", " + winStartY);
                }
            } else if (e.getEventType() == MouseEvent.MOUSE_DRAGGED) {
                if (dragInProgress) {
                    var deltaX = e.getScreenX() - dragStartX;
                    var deltaY = e.getScreenY() - dragStartY;
                    var newWinX = winStartX + deltaX;
                    var newWinY = winStartY + deltaY;
//                    System.err.println("MouseDrag: delta: " +
//                            deltaX + ", " + deltaY + 
//                            "  new window pos: " +
//                            newWinX + ", " + newWinY);
                    stage.setX(newWinX);
                    stage.setY(newWinY);
                }
            } else if (e.getEventType() == MouseEvent.MOUSE_RELEASED) {
                if (e.getButton() == MouseButton.PRIMARY) {
                    dragInProgress = false;
//                    System.err.println("MouseReleased: " +
//                            "winStart: " + winStartX + ", " + winStartY);
                }
            }
        };

        scene.addEventHandler(MouseEvent.ANY, mouseHandler);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Application.launch(args);
    }
}
