动画矩形形状鼠标的距离单击

时间:2014-11-06 04:53:20

标签: java javafx javafx-2

我过去几个小时一直被这个愚蠢的虫子困住了。基本上,我想动画(滑动)小矩形到我在框中单击鼠标的位置(X值是我现在关心的所有)。下面的来源就是这样。

然而,我真正想要的是保存终点的位置,这样如果我点击窗格的中点,框会滑到中间点(如上所述),然后如果我点击3/4的方式,盒子会从中间点滑动到3/4标记。

似乎我们所要做的就是setX(),对吧?好吧,取消注释我保存矩形的X坐标并再次运行它。你会看到它会跳跃!为什么?我完全没有任何线索,并且在过去的几个小时里一直试图为这个麻烦的bug找到一个修复/解决方法并且无处可去。如果有人能指出我正确的方向,我会向前付款,我保证。

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TimelineEvents extends Application {

    Rectangle myRectangle;

    public void start(Stage primaryStage) {
        Pane mainPane = new Pane(); // Create a ball pane
        //ballPane.play();
        Scene scene = new Scene(mainPane, 500, 500);
        primaryStage.setScene(scene);
        primaryStage.show();

        myRectangle = new Rectangle(0, 20, 30, 30);

        mainPane.setOnMouseClicked((MouseEvent event) -> {
            animate(event);
        });

        mainPane.getChildren().add(myRectangle);
    }

    public void animate(MouseEvent event) {

        Timeline timeline = new Timeline();
        System.out.println(myRectangle.getY());
        timeline.getKeyFrames().addAll(
                new KeyFrame(Duration.ZERO,
                        new KeyValue(myRectangle.translateXProperty(), 0),
                        new KeyValue(myRectangle.translateYProperty(), 0)
                ),
                new KeyFrame(new Duration(1000),
                        new KeyValue(myRectangle.translateXProperty(), event.getX()),
                        new KeyValue(myRectangle.translateYProperty(), 0)
                )
        );

        timeline.play();

        timeline.setOnFinished((ActionEvent) -> {
            //myRectangle.setX(event.getX());
        });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

1 个答案:

答案 0 :(得分:0)

您始终将动画设置为零位置,更改动画如下:

timeline.getKeyFrames().addAll(
      new KeyFrame(Duration.ZERO,
         new KeyValue(myRectangle.translateXProperty(), myRectangle.getTranslateX()),
          new KeyValue(myRectangle.translateYProperty(), 0)
      ),
....

修改 结合评论,您只需要

timeline.getKeyFrames().add(
        new KeyFrame(new Duration(1000),
                new KeyValue(myRectangle.translateXProperty(), event.getX())
        )
);