Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.77 KB | None | 0 0
  1. import javafx.event.EventHandler;
  2. import javafx.scene.Cursor;
  3. import javafx.scene.input.MouseEvent;
  4. import javafx.scene.layout.VBox;
  5.  
  6. /**
  7. * {@link DragResizerXY} can be used to add mouse listeners to a container
  8. * and make it resizable by the user by clicking and dragging the border in the
  9. * same way as a window.
  10. *
  11. * This version uses EventFilter for mouse event registration, so these events
  12. * are taken by DragResizerXY first before being consumed by other elements.
  13. *
  14. * Usage:
  15. * <pre>
  16. * DragResizer.makeResizable(myVBox);
  17. * </pre>
  18.  
  19. * Builds on the modifications of Cannibalsticky to the original version by
  20. * AndyTill.
  21. *
  22. * @author RamusisTrenksmas
  23. */
  24.  
  25. public class DragResizerXY {
  26.  
  27. /**
  28. * The margin around the control that a user can click in to start resizing
  29. * the region.
  30. */
  31. private static final int RESIZE_MARGIN = 10;
  32.  
  33. private final VBox region;
  34.  
  35. private double y;
  36.  
  37. private double x;
  38.  
  39. private boolean initMinHeight;
  40.  
  41. private boolean initMinWidth;
  42.  
  43. private boolean draggableZoneX, draggableZoneY;
  44.  
  45. private boolean dragging;
  46.  
  47. DragResizerXY(VBox aRegion) {
  48. region = aRegion;
  49. }
  50.  
  51. public static void makeResizable(VBox region) {
  52.  
  53. final DragResizerXY resizer = new DragResizerXY(region);
  54.  
  55. region.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
  56. @Override
  57. public void handle(MouseEvent mouseEvent) {
  58. resizer.mousePressed(mouseEvent);
  59. }
  60. });
  61.  
  62. region.addEventFilter(MouseEvent.MOUSE_DRAGGED, new EventHandler<MouseEvent>() {
  63. @Override
  64. public void handle(MouseEvent mouseEvent) {
  65. resizer.mouseDragged(mouseEvent);
  66. }
  67. });
  68.  
  69. region.addEventFilter(MouseEvent.MOUSE_MOVED, new EventHandler<MouseEvent>() {
  70. @Override
  71. public void handle(MouseEvent mouseEvent) {
  72. resizer.mouseOver(mouseEvent);
  73. }
  74. });
  75.  
  76. region.addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
  77. @Override
  78. public void handle(MouseEvent mouseEvent) {
  79. resizer.mouseReleased(mouseEvent);
  80. }
  81. });
  82. }
  83.  
  84. protected void mouseReleased(MouseEvent event) {
  85. dragging = false;
  86. region.setCursor(Cursor.DEFAULT);
  87. }
  88.  
  89. protected void mouseOver(MouseEvent event) {
  90. if (isInDraggableZone(event) || dragging) {
  91. if (draggableZoneY) {
  92. region.setCursor(Cursor.S_RESIZE);
  93. }
  94.  
  95. if (draggableZoneX) {
  96. region.setCursor(Cursor.E_RESIZE);
  97. }
  98.  
  99. } else {
  100. region.setCursor(Cursor.DEFAULT);
  101. }
  102. }
  103.  
  104.  
  105. //had to use 2 variables for the controll, tried without, had unexpected behaviour (going big was ok, going small nope.)
  106. protected boolean isInDraggableZone(MouseEvent event) {
  107. draggableZoneY = (boolean)(event.getY() > (region.getHeight() - RESIZE_MARGIN));
  108. draggableZoneX = (boolean)(event.getX() > (region.getWidth() - RESIZE_MARGIN));
  109. return (draggableZoneY || draggableZoneX);
  110. }
  111.  
  112. protected void mouseDragged(MouseEvent event) {
  113. if (!dragging) {
  114. return;
  115. }
  116.  
  117. if (draggableZoneY) {
  118. double mousey = event.getY();
  119.  
  120. double newHeight = region.getMinHeight() + (mousey - y);
  121.  
  122. region.setMinHeight(newHeight);
  123.  
  124. y = mousey;
  125. }
  126.  
  127. if (draggableZoneX) {
  128. double mousex = event.getX();
  129.  
  130. double newWidth = region.getMinWidth() + (mousex - x);
  131.  
  132. region.setMinWidth(newWidth);
  133.  
  134. x = mousex;
  135. }
  136. }
  137.  
  138. protected void mousePressed(MouseEvent event) {
  139.  
  140. // ignore clicks outside of the draggable margin
  141. if (!isInDraggableZone(event)) {
  142. return;
  143. }
  144.  
  145. dragging = true;
  146.  
  147. // make sure that the minimum height is set to the current height once,
  148. // setting a min height that is smaller than the current height will
  149. // have no effect
  150. if (!initMinHeight) {
  151. region.setMinHeight(region.getHeight());
  152. initMinHeight = true;
  153. }
  154.  
  155. y = event.getY();
  156.  
  157. if (!initMinWidth) {
  158. region.setMinWidth(region.getWidth());
  159. initMinWidth = true;
  160. }
  161.  
  162. x = event.getX();
  163. }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement