How to drag an unpainted JavaFX window (scene)

I have this unpainted window:

public static void initStartPage(final Stage primaryStage) { final Stage startPage = new Stage(); startPage.initStyle(StageStyle.UNDECORATED); //startPage.initOwner(primaryStage); //startPage.toFront(); Scene scene = new Scene(agentsPanel(), 900, 500); startPage.setScene(scene); startPage.show(); } 

I would like to know how I can make this a draggable unpainted window ? I want to change its position when the user selects a window with the right mouse button and then moves the mouse while holding down the mouse button.

PS I tested this solution, but it does not work:

 private static FlowPane flow; private static BorderPane bpi; public static void initStartPage(final Stage primaryStage) { final Stage startPage = new Stage(); startPage.initStyle(StageStyle.UNDECORATED); startPage.initOwner(primaryStage); //startPage.toFront(); Scene scene = new Scene(agentsPanel(primaryStage), 900, 500); startPage.setScene(scene); startPage.show(); } private static double xOffset = 0; private static double yOffset = 0; public static BorderPane agentsPanel(final Stage primaryStage) { BorderPane bp = new BorderPane(); bp.setPrefSize(900, 500); bp.setMaxSize(900, 500); HBox thb = new HBox(10); // Set spacing between each child into the HBox thb.setPadding(new Insets(15, 15, 15, 15)); HBox bhb = new HBox(10); // Set spacing between each child into the HBox bhb.setPadding(new Insets(15, 15, 15, 15)); bp.setTop(thb); bp.setBottom(bhb); bp.setCenter(navigationPanel()); bp.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { xOffset = event.getSceneX(); yOffset = event.getSceneY(); } }); bp.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { primaryStage.setX(event.getScreenX() - xOffset); primaryStage.setY(event.getScreenY() - yOffset); } }); return bp; } 
+10
javafx javafx-2 javafx-8
source share
2 answers

Just change the setOnMousePressed method to this:

 bp.setOnMousePressed(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { xOffset = primaryStage.getX() - event.getScreenX(); yOffset = primaryStage.getY() - event.getScreenY(); } }); 

and your setOnMouseDragged:

 bp.setOnMouseDragged(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { primaryStage.setX(event.getScreenX() + xOffset); primaryStage.setY(event.getScreenY() + yOffset); } }); 
+28
source share

You can use this, it works for a stage as well as an alert (basically a different stage, but for Pup-Po messages). this node is the main node of this stage

 //Make a Stage Draggable public void DraggableStage(Node node, Stage stage, Alert alert ) { double[] xOffset = {0}, yOffset = {0}; node.setOnMousePressed(event -> { if (stage != null && alert == null){ xOffset[0] = stage.getX() - event.getScreenX(); yOffset[0] = stage.getY() - event.getScreenY(); } else if(stage == null && alert != null){ xOffset[0] = alert.getX() - event.getScreenX(); yOffset[0] = alert.getY() - event.getScreenY(); } }); node.setOnMouseDragged(event -> { if (stage != null && alert == null){ stage.setX(event.getScreenX() + xOffset[0]); stage.setY(event.getScreenY() + yOffset[0]); } else if(stage == null && alert != null){ alert.setX(event.getScreenX() + xOffset[0]); alert.setY(event.getScreenY() + yOffset[0]); } }); } 
-one
source share

All Articles