Skip to content

Instantly share code, notes, and snippets.

@rutsatz
Created June 30, 2018 19:40
Show Gist options
  • Save rutsatz/bb80e9535ff665276c5128260428eaa8 to your computer and use it in GitHub Desktop.
Save rutsatz/bb80e9535ff665276c5128260428eaa8 to your computer and use it in GitHub Desktop.
DragResizer and Move
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