如何平滑拖动JavaFX多边形?

时间:2014-03-06 13:35:02

标签: javafx javafx-2 javafx-8

我有一个多边形(三角形)。我想用鼠标拖动它。下面是我尝试的代码,但是使用此代码我无法顺利拖动它。请让我知道如何才能使其顺利拖延。

    public void start(Stage primaryStage) throws Exception {
    AnchorPane pane = new AnchorPane();

    final Polygon polygon   = new Polygon();
    polygon.getPoints().addAll(new Double[]{
            50.0,  50.0,
            30.0, 70.0,
            70.0, 70.0 });

    pane.getChildren().add(polygon);

    Scene scene = new Scene(pane, 200, 200, Color.WHITE);
    primaryStage.setScene(scene);
    primaryStage.show();

    polygon.setOnMouseDragged(new EventHandler<MouseEvent>() {

        @Override
        public void handle(MouseEvent event) {
            polygon.setLayoutX(event.getX());
            polygon.setLayoutY(event.getY());

        }
    });
  } 

1 个答案:

答案 0 :(得分:6)

问题是鼠标事件的坐标(event.getX()和event.getY())是相对于多边形的;而多边形的layoutX和layoutY是相对于多边形的父级(即窗格)。

有很多方法可以做到这一点,但都涉及测量相对于固定事物(例如场景)的事件坐标,并通过这些坐标的变化来增加layoutX和layoutY。

这样的事情会起作用:

    final ObjectProperty<Point2D> mousePosition = new SimpleObjectProperty<>();

    polygon.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY()));
        }
    });

    polygon.setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            double deltaX = event.getSceneX() - mousePosition.get().getX();
            double deltaY = event.getSceneY() - mousePosition.get().getY();
            polygon.setLayoutX(polygon.getLayoutX()+deltaX);
            polygon.setLayoutY(polygon.getLayoutY()+deltaY);
            mousePosition.set(new Point2D(event.getSceneX(), event.getSceneY()));
        }
    });