title: Allow user to resize an undecorated Stage
body: <p>I am working on making a screen recorder in JavaFX and one utility that is mandatory in the screen recorder is to let the user define how much area to record.   </p>
  
  <p>I managed to make an undecorated , semi-transparent <code>Stage</code> that can be dragged around to define the area and added a <code>close</code> button to let the user confirm the area which is  to be recorded.  </p>
  
  <p><strong>Now, how do I let the user resize the stage by dragging it by its edges ?</strong>  </p>
  
  <p>SSCCE:  </p>
  
  <pre><code>package draggable;
  
  import javafx.application.Application;
  import javafx.event.ActionEvent;
  import javafx.event.EventHandler;
  import javafx.geometry.Pos;
  import javafx.geometry.Rectangle2D;
  import javafx.scene.Scene;
  import javafx.scene.SceneBuilder;
  import javafx.scene.control.Button;
  import javafx.scene.control.ButtonBuilder;
  import javafx.scene.input.MouseEvent;
  import javafx.scene.layout.StackPane;
  import javafx.scene.layout.StackPaneBuilder;
  import javafx.scene.paint.Color;
  import javafx.stage.Screen;
  import javafx.stage.Stage;
  import javafx.stage.StageStyle;
  
  public class DraggableStage extends Application{
  
      Button close;
      StackPane holder;
      Rectangle2D maxBounds;
      Scene theScene;
  
      double pressedX;
      double pressedY;
      double draggedX;
      double draggedY;
  
      @Override
      public void start(Stage stage) throws Exception {
          final Stage theStage = stage;
  
          // determine how big the screen is
          maxBounds = Screen.getPrimary().getVisualBounds(); 
  
          //create the close button
          close = ButtonBuilder
                  .create()
                  .text("Close")
                  .build();
  
          //create the StackPane holder for the button
          holder = StackPaneBuilder
                      .create()
                      .alignment(Pos.CENTER)
                      .children(close)
                      .build();
  
          // you cannot resize the screen beyond the max resolution of the screen
          holder.setMaxSize(maxBounds.getWidth(), maxBounds.getHeight());
  
          //you cannot resize under half the width and height of the screen
          holder.setMinSize(maxBounds.getWidth() / 2,maxBounds.getHeight() / 2);
  
          //the scene where it all happens
          theScene = SceneBuilder
                        .create()
                        .root(holder)
                        .width(maxBounds.getWidth() / 2)
                        .height(maxBounds.getHeight() / 2)
                        .build();
  
          // add the button listeners
          close.setOnAction(new EventHandler&lt;ActionEvent&gt;(){
              @Override
              public void handle(ActionEvent event) {
                  theStage.close();
              }
          });
  
          // add the drag and press listener for the StackPane
          holder.setOnMousePressed(new EventHandler&lt;MouseEvent&gt;(){
              @Override
              public void handle(MouseEvent e) {
                  pressedX = e.getX();
                  pressedY = e.getY();
              }
          });
  
          holder.setOnMouseDragged(new EventHandler&lt;MouseEvent&gt;(){
              @Override
              public void handle(MouseEvent e) {
                  draggedX = e.getX();
                  draggedY = e.getY();
  
                  double differenceX = draggedX - pressedX;
                  double differenceY = draggedY - pressedY;
  
                  theStage.setX(theStage.getX() + differenceX);
                  theStage.setY(theStage.getY() + differenceY); 
              }
          });
  
          //the mandatory mumbo jumbo
          theScene.setFill(Color.rgb(128, 128, 128, 0.5));
          stage.initStyle(StageStyle.TRANSPARENT);
          stage.setScene(theScene);
          stage.sizeToScene();
          stage.show();
      }
  
      public static void main(String[] args) {
          Application.launch("draggable.DraggableStage");
      }
  }  
  </code></pre>
  
  <p>Image:<br>
  <img src="https://i.stack.imgur.com/UUDes.png" alt="enter image description here"></p>