im пытается создать событие для перетаскивания пути в javafx, однако, используя setLayoutX/Y
, вы потеряете элемент Path
под курсами при нажатой мыши, но будет плавно перетаскиваться мышью. Я использую метод setTranslateX/Y
, и он не падает Path
ниже курсов, однако перетаскивание не является гладким и делает Path
узел прыгает назад и вперед по перетаскиванию. Path
создается как объект freedraw.Путь перетаскивания в javafx
создать путь, используя этот код:
EventHandler<MouseEvent> mouseEventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle (MouseEvent e) {
if (i == 0) {
if (e.getEventType() == MouseEvent.MOUSE_PRESSED) {
j = 1;
path = new Path();
path.setStroke(color);
path.setStrokeWidth(10);
root.getChildren().add(path);
path.getElements().add(new MoveTo(e.getX(), e.getY()));
}
if (e.getEventType() == MouseEvent.MOUSE_DRAGGED) {
if (j == 1) {
path.getElements().add(new LineTo(e.getX(), e.getY()));
}
}
if (e.getEventType() == MouseEvent.MOUSE_RELEASED) {
if (j == 1) {
path.getElements().add(new LineTo(e.getX(), e.getY()));
path.setOnMouseEntered(new PathEventHandler(paths.size()));
path.setOnMouseExited(new PathEventHandler(paths.size()));
path.setOnMousePressed(new PathEventHandler(paths.size()));
path.setOnMouseDragged(new PathEventHandler(paths.size()));
path.setOnMouseReleased(new PathEventHandler(paths.size()));
path.setOnMouseClicked(new PathEventHandler(paths.size()));
paths.add(path);
cachePath.add(path);
cacheType.add("Create");
j = 0;
}
}
}
Для перетаскивания созданного пути из списка путей я использую этот код:
class PathEventHandler implements EventHandler<MouseEvent>{
//element number in paths
public int n;
public PathEventHandler(int n){
this.n=n;
}
@Override
public void handle(MouseEvent me) {
if (me.getEventType() == MouseEvent.MOUSE_ENTERED) {
paths.get(n).setEffect(new DropShadow(20, Color.BLACK));
}
if (me.getEventType() == MouseEvent.MOUSE_EXITED) {
paths.get(n).setEffect(null);
}
if (i == 2) {
if (me.getEventType() == MouseEvent.MOUSE_PRESSED) {
x = me.getX();
y = me.getY();
}
if (me.getEventType() == MouseEvent.MOUSE_DRAGGED) {
paths.get(n).setTranslateX(me.getX() - x + paths.get(n).getTranslateX());
paths.get(n).setTranslateY(me.getY() - y + paths.get(n).getTranslateY());
/*paths.get(n).setTranslateX(me.getX());
paths.get(n).setTranslateY(me.getY()); */
listX.add(paths.get(n).getTranslateX());
listY.add(paths.get(n).getTranslateY());
x = me.getX();
y = me.getY();
}
if (me.getEventType() == MouseEvent.MOUSE_RELEASED) {
cachePath.add(paths.get(n));
cacheType.add("Relocate");
}
if (me.getEventType() == MouseEvent.MOUSE_CLICKED) {
if (me.getButton() == MouseButton.SECONDARY) {
root.getChildren().remove(paths.get(n));
cachePath.add(paths.get(n));
cacheType.add("Remove");
}
}
}
}