JavaFX在KeyHandler中添加关键帧

JavaFX在KeyHandler中添加关键帧,java,javafx,Java,Javafx,因此,我目前正在尝试创建一个项目,您可以在其中移动一个长方体。盒子的移动通过关键帧“记录”,通过空格键确认后,可以再次播放移动。 我的问题是,当按下空格键时,长方体只会在一瞬间捕捉到它的起点(100100),然后返回到它之前的任何位置 这是我的密码: import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.sce

因此,我目前正在尝试创建一个项目,您可以在其中移动一个长方体。盒子的移动通过关键帧“记录”,通过空格键确认后,可以再次播放移动。 我的问题是,当按下空格键时,长方体只会在一瞬间捕捉到它的起点(100100),然后返回到它之前的任何位置

这是我的密码:

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {
    static Rectangle rectangle;
    Timeline timeline = new Timeline();
    KeyFrame keyFrame;
    @Override
    public void start(Stage primaryStage) throws Exception{

        initializeRectangle();
        Group group = new Group();
        group.getChildren().add(rectangle);

        Scene scene = new Scene(group, 300, 300);
        addKeyHandlers(scene);

        primaryStage.setScene(scene);
        primaryStage.show();
    }
    private void initializeRectangle(){
        rectangle = new Rectangle();
        rectangle.setX(100);
        rectangle.setY(100);
        rectangle.setHeight(50);
        rectangle.setWidth(50);
        rectangle.setFill(Color.BLACK);
    }

    private void addKeyHandlers(Scene scene){

        scene.setOnKeyPressed(e -> {
            if (e.getCode() == KeyCode.S) {
                rectangle.setY(rectangle.getY() + 3);
                keyFrame = new KeyFrame(new Duration(20), actionEvent -> {
                    rectangle.setY(rectangle.getY() + 3);
                });
                timeline.getKeyFrames().addAll(keyFrame);
            }
            if (e.getCode() == KeyCode.W) {
                rectangle.setY(rectangle.getY() - 3);
                keyFrame = new KeyFrame(new Duration(20), actionEvent -> {
                    rectangle.setY(rectangle.getY() - 3);
                });
                timeline.getKeyFrames().addAll(keyFrame);
            }
            if (e.getCode() == KeyCode.D) {
                rectangle.setX(rectangle.getX() + 3);
                keyFrame = new KeyFrame(new Duration(20), actionEvent -> {
                    rectangle.setX(rectangle.getX() + 3);
                });
                timeline.getKeyFrames().addAll(keyFrame);
            }
            if (e.getCode() == KeyCode.A) {
                rectangle.setX(rectangle.getX() - 3);
                keyFrame = new KeyFrame(new Duration(20), actionEvent -> {
                    rectangle.setX(rectangle.getX() - 3);
                });
                timeline.getKeyFrames().addAll(keyFrame);
            }
            if(e.getCode() == KeyCode.SPACE){
                rectangle.setX(100);
                rectangle.setY(100);
                timeline.play();
            }
        });
    }


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

注意:我是Java/JavaFX的绝对初学者,在互联网上找不到解决这个问题的任何方法,我的教授也没有回答我(oof)

持续时间指定了
关键帧
和动画开始(循环)之间的持续时间,不是最后一个
关键帧与具有该属性的关键帧之间的时间。将20ms指定为每个关键帧的
时间
属性可以使所有关键帧同时发生…谢谢你,你解决了我的问题。祝您度过愉快的一天:)持续时间指定
关键帧
与动画(循环)开始之间的持续时间,而不是最后一个
关键帧
与具有该属性的关键帧之间的时间。将20ms指定为每个关键帧的
时间
属性可以使所有关键帧同时发生…谢谢你,你解决了我的问题。祝你今天愉快:)