Created
June 30, 2018 19:40
-
-
Save rutsatz/bb80e9535ff665276c5128260428eaa8 to your computer and use it in GitHub Desktop.
DragResizer and Move
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package javafxregion; | |
import javafx.event.EventHandler; | |
import javafx.scene.Cursor; | |
import javafx.scene.Node; | |
import javafx.scene.input.MouseEvent; | |
import javafx.scene.layout.Region; | |
/** | |
* {@link DragResizerXY} can be used to add mouse listeners to a {@link Region} | |
* and make it resizable by the user by clicking and dragging the border in the | |
* same way as a window. | |
* <p> | |
* Height and Width resizing is working (hopefully) properly | |
* | |
* <pre> | |
* DragResizer.makeResizable(myAnchorPane); | |
* </pre> | |
* | |
* @author Cannibalsticky (modified from the original DragResizer created by | |
* AndyTill) | |
* | |
*/ | |
public class DragResizer { | |
/** | |
* The margin around the control that a user can click in to start resizing | |
* the region. | |
*/ | |
private static final int RESIZE_MARGIN = 10; | |
private final Region region; | |
private double y; | |
private double x; | |
private boolean initMinHeight; | |
private boolean initMinWidth; | |
private boolean draggableZoneX, draggableZoneY; | |
private boolean dragging; | |
private double orgSceneX, orgSceneY; | |
private double orgTranslateX, orgTranslateY; | |
private DragResizer(Region aRegion) { | |
region = aRegion; | |
} | |
public static void makeResizable(Region region) { | |
final DragResizer resizer = new DragResizer(region); | |
region.setOnMousePressed(new EventHandler<MouseEvent>() { | |
@Override | |
public void handle(MouseEvent event) { | |
resizer.mousePressed(event); | |
} | |
}); | |
region.setOnMouseDragged(new EventHandler<MouseEvent>() { | |
@Override | |
public void handle(MouseEvent event) { | |
resizer.mouseDragged(event); | |
} | |
}); | |
region.setOnMouseMoved(new EventHandler<MouseEvent>() { | |
@Override | |
public void handle(MouseEvent event) { | |
resizer.mouseOver(event); | |
} | |
}); | |
region.setOnMouseReleased(new EventHandler<MouseEvent>() { | |
@Override | |
public void handle(MouseEvent event) { | |
resizer.mouseReleased(event); | |
} | |
}); | |
} | |
protected void mouseReleased(MouseEvent event) { | |
dragging = false; | |
region.setCursor(Cursor.DEFAULT); | |
} | |
protected void mouseOver(MouseEvent event) { | |
if (isInDraggableZone(event) || dragging) { | |
if (draggableZoneY) { | |
region.setCursor(Cursor.S_RESIZE); | |
} | |
if (draggableZoneX) { | |
region.setCursor(Cursor.E_RESIZE); | |
} | |
} else { | |
// region.setCursor(Cursor.DEFAULT); | |
region.setCursor(Cursor.MOVE); | |
} | |
} | |
//had to use 2 variables for the controll, tried without, had unexpected behaviour (going big was ok, going small nope.) | |
protected boolean isInDraggableZone(MouseEvent event) { | |
draggableZoneY = (boolean) (event.getY() > (region.getHeight() - RESIZE_MARGIN)); | |
draggableZoneX = (boolean) (event.getX() > (region.getWidth() - RESIZE_MARGIN)); | |
return (draggableZoneY || draggableZoneX); | |
} | |
protected void mouseDragged(MouseEvent event) { | |
if (!dragging) { | |
double offsetX = event.getSceneX() - orgSceneX; | |
double offsetY = event.getSceneY() - orgSceneY; | |
double newTranslateX = orgTranslateX + offsetX; | |
double newTranslateY = orgTranslateY + offsetY; | |
((Node) (event.getSource())).setTranslateX(newTranslateX); | |
((Node) (event.getSource())).setTranslateY(newTranslateY); | |
return; | |
} | |
if (draggableZoneY) { | |
double mousey = event.getY(); | |
double newHeight = region.getMinHeight() + (mousey - y); | |
region.setMinHeight(newHeight); | |
y = mousey; | |
} | |
if (draggableZoneX) { | |
double mousex = event.getX(); | |
double newWidth = region.getMinWidth() + (mousex - x); | |
region.setMinWidth(newWidth); | |
x = mousex; | |
} | |
} | |
protected void mousePressed(MouseEvent event) { | |
// ignore clicks outside of the draggable margin | |
if (!isInDraggableZone(event)) { | |
orgSceneX = event.getSceneX(); | |
orgSceneY = event.getSceneY(); | |
orgTranslateX = ((Node) (event.getSource())).getTranslateX(); | |
orgTranslateY = ((Node) (event.getSource())).getTranslateY(); | |
return; | |
} | |
dragging = true; | |
// make sure that the minimum height is set to the current height once, | |
// setting a min height that is smaller than the current height will | |
// have no effect | |
if (!initMinHeight) { | |
region.setMinHeight(region.getHeight()); | |
initMinHeight = true; | |
} | |
y = event.getY(); | |
if (!initMinWidth) { | |
region.setMinWidth(region.getWidth()); | |
initMinWidth = true; | |
} | |
x = event.getX(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment