java - 键盘操作事件在 JavaFX 中不起作用

标签 java animation javafx event-handling

我用几种形状创建了一辆汽车,并使用 PathTransition 将其从 Pane 的一侧移动到另一侧。我正在尝试通过按键(向上和向下箭头)来实现 Action 事件来加速或减慢汽车的速度。为什么即使我有鼠标事件工作,键盘事件也不起作用?

public class AnimatedCar extends Application {

    @Override
    public void start(Stage mainStage) throws Exception {
        Pane pane = new Pane();
        Group root = new Group();

        // Create a line for the rectangle path
        Line line = new Line();
        line.setStartX(25);
        line.setStartY(290);
        line.setEndX(275);
        line.setEndY(290);
        line.setStroke(Color.TRANSPARENT);
        pane.getChildren().add(line);

        // Create the Back Wheel
        Circle backWheel = new Circle();
        backWheel.setRadius(5);
        backWheel.setStroke(Color.BLACK);
        backWheel.setFill(Color.BLACK);
        backWheel.setCenterX(pane.getLayoutBounds().getWidth() + 20);
        backWheel.setCenterY(pane.getLayoutBounds().getHeight() + 295);
        root.getChildren().add(backWheel);

        // Create the front wheel
        Circle frontWheel = new Circle();
        frontWheel.setRadius(5);
        frontWheel.setStroke(Color.BLACK);
        frontWheel.setFill(Color.BLACK);
        frontWheel.setCenterX(pane.getLayoutBounds().getWidth() + 40);
        frontWheel.setCenterY(pane.getLayoutBounds().getHeight() + 295);
        root.getChildren().add(frontWheel);

        // Create the rectangle part of the car body
        Rectangle rec = new Rectangle(5, 280, 50, 10);
        rec.setStroke(Color.BLUE);
        rec.setFill(Color.BLUE);
        root.getChildren().add(rec);

        // Create polygon for the top trapezoid
        Polygon trapezoid = new Polygon();
        trapezoid.getPoints().addAll(new Double[] { 15.0, 280.0, 20.0, 270.0, 40.0, 270.0, 45.0, 280.0 });
        trapezoid.setFill(Color.BLUE);
        trapezoid.setStroke(Color.BLUE);
        root.getChildren().add(trapezoid);

        // connect the shapes together
        pane.getChildren().add(root);

        // Create a path transition for the rectanagle
        PathTransition pt = new PathTransition();
        pt.setRate(0.25);
        pt.setPath(line);
        pt.setNode(root);
        pt.setOrientation(PathTransition.OrientationType.ORTHOGONAL_TO_TANGENT);
        pt.setCycleCount(Timeline.INDEFINITE);
        pt.setAutoReverse(false);
        pt.play();

        // Create the pause action on the pressed left mouse button
        pane.setOnMousePressed(e -> {
            pt.getStatus();
            if (Status.RUNNING != null)
                pt.pause();
        });
        pane.setOnMouseReleased(e -> {
            pt.getStatus();
            if (Status.STOPPED != null)
                pt.play();

        });

        // Action events for key presses
        pane.setOnKeyPressed(e -> {
            if (e.getCode() == KeyCode.UP) {
                pt.setRate((pt.getRate() + .03));
            }
        });

        pane.setOnKeyTyped(e -> {
            if (e.getCode() == KeyCode.DOWN) {
                pt.setRate(pt.getRate() - 0.03);
            }
        });

        // Put everything together!
        Scene scene = new Scene(pane, 305, 305);
        mainStage.setTitle("Racecar");
        mainStage.setScene(scene);
        mainStage.show();

    }

    // Main Method to start the program
    public static void main(String[] args) {
        launch(args);
    }

}

A picture of the window

最佳答案

Pane 没有焦点,因此关键监听器不起作用。尝试在舞台可见后请求焦点。

mainStage.show();
pane.requestFocus();

此外,您可以将向上和向下按键的逻辑移至单个方法中。

pane.setOnKeyPressed(e -> {
    if (e.getCode() == KeyCode.UP) {
        pt.setRate((pt.getRate() + .03));
    } else if (e.getCode() == KeyCode.DOWN) {
        pt.setRate(pt.getRate() - 0.03);
    }
});

关于java - 键盘操作事件在 JavaFX 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33584337/

相关文章:

java - 在JavaFX中绑定(bind)两个TableView之间TableColumns的排序行为

java - 如何映射 Java 语言环境和 Lucene 分析器?

java - 从 Map 创建列表,其中包含 Map 值的前 N ​​个对象

javascript - 使用 jQuery 设置 CSS 动画迭代次数

android - 如何获得Lottie动画中可用的总帧数?

java - 在 JavaFX 中使用 CSS 样式化 ChoiceBox 列表

java - HBase-创建表时出错

java - 如何将一个 Pane 连接到另一个 Pane

iphone - transitionFromView 动画开始回调 :toView:duration

JavaFX - 顺序转换 - 来回播放(一步一步)