2014-12-18 2 views
0

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"); 
     } 
    } 
    } 
} 

ответ

1

Вы должны добавить путь к группе и то вы можете Drag Smoothly. Я не знаю, почему вы используете список путей, но этого не потребуется, потому что у нас есть объект Path, искаженный объектом Group, и вы можете вносить изменения в объект Path. Если вам по-прежнему нужен список по какой-либо причине, вы можете собирать объект Group в список, а затем использовать его для наложения пути.

Тогда взгляните на это и сделал эти изменения

if (e.getEventType() == MouseEvent.MOUSE_RELEASED) { 
        if (j == 1) { 
         paths.add(path); 
         root.getChildren().add(new DragablePath(path)); 
         cachePath.add(path); 
         cacheType.add("Create"); 


        } 
       } 

Вот класс DragablePath и класс DragContext. Вы можете использовать «Обработчики событий DragablePath» так же, как вы использовали «Обработчики событий пути».

class DragablePath extends Group { 

    private final Node node; 

    DragablePath(Node node) { 
     this.node = node; 
     this.getChildren().add(node); 
     final DragContext dragContext = new DragContext(); 
     this.addEventFilter(
       MouseEvent.ANY, 
       new EventHandler<MouseEvent>() { 
        @Override 
        public void handle(final MouseEvent mouseEvent) { 
         mouseEvent.consume(); 

        } 
       }); 
     this.addEventFilter(
       MouseEvent.MOUSE_ENTERED, 
       new EventHandler<MouseEvent>() { 
        @Override 
        public void handle(final MouseEvent mouseEvent) { 
         node.setEffect(new DropShadow(20, Color.BLACK)); 

        } 
       }); 
     this.addEventFilter(
       MouseEvent.MOUSE_EXITED, 
       new EventHandler<MouseEvent>() { 
        @Override 
        public void handle(final MouseEvent mouseEvent) { 
         node.setEffect(null); 

        } 
       }); 

     this.addEventFilter(
       MouseEvent.MOUSE_PRESSED, 
       new EventHandler<MouseEvent>() { 
        @Override 
        public void handle(final MouseEvent mouseEvent) { 
         dragContext.mouseAnchorX = mouseEvent.getX(); 
         dragContext.mouseAnchorY = mouseEvent.getY(); 
         dragContext.initialTranslateX = node.getTranslateX(); 
         dragContext.initialTranslateY = node.getTranslateY(); 

        } 
       }); 
     this.addEventFilter(
       MouseEvent.MOUSE_DRAGGED, 
       new EventHandler<MouseEvent>() { 
        @Override 
        public void handle(final MouseEvent mouseEvent) { 

         node.setTranslateX(
           dragContext.initialTranslateX 
           + mouseEvent.getX() 
           - dragContext.mouseAnchorX); 
         node.setTranslateY(
           dragContext.initialTranslateY 
           + mouseEvent.getY() 
           - dragContext.mouseAnchorY); 

        } 
       }); 
     this.addEventFilter(
       MouseEvent.MOUSE_RELEASED, 
       new EventHandler<MouseEvent>() { 

        @Override 
        public void handle(final MouseEvent mouseEvent) { 

        } 
       }); 

    } 
} 

private static final class DragContext { 

    public double mouseAnchorX; 
    public double mouseAnchorY; 
    public double initialTranslateX; 
    public double initialTranslateY; 

} 

** Совет. Вы можете включить подсказки для сглаживания с помощью setSmooth (true) формы.

Смежные вопросы