JavaFX Tutorial
Drag an undecorated stage in JavaFX? You are in the right place to learn more about JavaFX programming. If you are creating a JavaFX application that is undecorated stage or window, you probably ask yourself how can I drag the undecorated window in JavaFX. So, in this tutorial you will learn how to drag an undecorated stage in JavaFX. Keep on reading and let us start learning.
What is exactly needed to drag an undecorated stage in JavaFX. Well, we just need getScene(), getWindow(), getScreenY(), getScreenX(), getSceneX() and Y. So, in my case I am using a Scene Builder to make a window in my JavaFX application and I generated the controller for my FXML.
How to drag an undecorated stage in JavaFX
To drag an undecorated stage in JavaFX. We need to make a mouse pressed event from your root node or where you want to press the mouse and drag. For me, I am going to use the root node which is the BorderPane layout. Inside the mouse pressed event, we need to get the Scene X and Y. Before that make a double data type at the Global variable so that the other access modifiers can access the double data type.
private double x = 0; private double y = 0;
To get the scene X and Y inside the mouse event (Mouse pressed). Simply call the x variable from double data type and call the event variable from the Mouse Event, after doing that simply specify the getSceneX(). Kindly see the example code below.
x = event.getSceneX(); y = event.getSceneY();
By doing that, we are getting the location of the Scene to calculate it in our Mouse Drag Event. To achieve the mouse drag, simply make a mouse dragged event in the Scene Builder if you are using a Scene Builder and make controller again to update your Java Controller. So, inside the mouse dragged event. We also need to access the stage. The easiest way to access the stage is to define and cast the stage inside the mouse event and specify the node to get the scene and window. Like in the code below.
Stage stage = (Stage) borderpane.getScene().getWindow();
After doing that, make a new line and call the variable stage to set the X and Y. Inside the setX() parameter call the variable event and getScreenX() minus the double variable x. For better understanding, please see the code below.
stage.setX(event.getScreenX() - x); stage.setY(event.getScreenY() - y);
That’s it, you can now drag your undecorated stage in JavaFX. I will provide an example code below for the Mouse Event and the global variable.
Mouse Events (Pressed and Dragged)
@FXML private void borderpane_dragged(MouseEvent event) { Stage stage = (Stage) borderpane.getScene().getWindow(); stage.setY(event.getScreenY() - y); stage.setX(event.getScreenX() - x); } @FXML private void borderpane_pressed(MouseEvent event) { x = event.getSceneX(); y = event.getSceneY(); }
Double Data type should be declared at the global
private double x = 0; private double y = 0;