首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaFX -不处理键盘事件

JavaFX -不处理键盘事件
EN

Stack Overflow用户
提问于 2018-09-28 03:46:33
回答 1查看 351关注 0票数 1

我正在写一个类似于Arkanoid的简单游戏。需要按向左箭头进行平台移位。负责单击按钮的代码:

代码语言:javascript
复制
                    canvas.requestFocus();
                    canvas.setOnKeyTyped(new EventHandler<KeyEvent>() {
                        @Override
                        public void handle(KeyEvent event) {
                            if (event.getCode() == KeyCode.LEFT) {
                                System.out.println("Leffft");
                                platform.LeftShift();
                                event.consume();
                            }
                        }
                    });

问题是,当您启动并按下按钮时,没有任何反应。

GameField.java

代码语言:javascript
复制
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.util.Duration;

public class GameField extends Application {

public static GameField me;
public GameField()
{
    me=this;
}

static Pane canvas = new Pane();
static Ball ball = new Ball(5, Color.WHITE);
static Platform platform = new Platform(80,5, Color.WHITE);
Scene scene = new Scene(canvas,550,500, Color.BLACK);
static Timeline timeline;


@Override
public void start(Stage stage) {
    canvas.getChildren().add(ball);
    canvas.getChildren().add(platform);
    ball.relocate(50, 50);
    platform.relocate(235,495);

    stage.setScene(scene);
    stage.setTitle("Cat Arcanoid");

    stage.show();




    timeline = new Timeline(new KeyFrame(Duration.millis(20),
            new EventHandler<ActionEvent>() {
        double dx = 10;
        double dy = 10;

                @Override
                public void handle(ActionEvent t) {
                    ball.setLayoutX(ball.getLayoutX() + dx);
                    ball.setLayoutY(ball.getLayoutY() + dy);

                    dx = ball.XCollision(dx);
                    dy = ball.YCollision(dy);
                    dy = platform.PlatformCollision(dy);
                    canvas.requestFocus();
                    canvas.setOnKeyTyped(new EventHandler<KeyEvent>() {
                        @Override
                        public void handle(KeyEvent event) {
                            if (event.getCode() == KeyCode.LEFT) {
                                System.out.println("Leffft");
                                platform.LeftShift();
                                event.consume();
                            }
                        }
                    });

                }

    }));

         timeline.setCycleCount(Timeline.INDEFINITE);
         timeline.play();
         }}

LeftShift方法

代码语言:javascript
复制
public void LeftShift(){
    double dx = 10;
    GameField.platform.relocate(getLayoutX()-dx, getLayoutY());
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-28 03:58:33

关键事件提供了两个“级别”的事件。

更高级别(来自keyTyped)

“按键输入”事件是较高级别的事件,通常不依赖于平台或键盘布局。它们是在输入Unicode字符时生成的,是了解字符输入的首选方法。.对于不生成Unicode字符的键(例如,操作键、修改键等),不会生成任何键类型的事件。

较低级别的'keyPressed‘和'keyReleased’事件可能会满足您的需求:

“按下按键”和“释放按键”事件是较低级别的事件,取决于平台和键盘布局。它们是在按下或释放某个键时生成的,并且是查找不会生成字符输入的键(例如,操作键、修改键等)的唯一方法。按下或释放的键由code变量指示,该变量包含虚拟键代码。

Javafx documentation

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52544131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档