java - JavaFX - 键盘事件不处理
问题描述
我正在编写一个类似于 Arkanoid 的简单游戏。有必要通过按左箭头进行平台移动。负责点击按钮的代码:
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();
}
}
});
问题是当您启动并按下按钮时没有任何反应。
游戏场.java
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();
}}
左移方法
public void LeftShift(){
double dx = 10;
GameField.platform.relocate(getLayoutX()-dx, getLayoutY());
}
解决方案
关键事件提供了两个“级别”的事件。
更高级别(来自 keyTyped)
“按键类型”事件是更高级别的,通常不依赖于平台或键盘布局。它们是在输入 Unicode 字符时生成的,并且是了解字符输入的首选方式。..................... 对于不生成 Unicode 字符的键(例如,操作键、修饰键等),不会生成键类型事件。
较低级别的 'keyPressed' 和 'keyReleased' 事件可能会给你你想要的:
“按键”和“按键释放”事件是较低级别的,取决于平台和键盘布局。它们在按下或释放键时生成,并且是找出不生成字符输入的键(例如,操作键、修饰键等)的唯一方法。被按下或释放的键由包含虚拟键代码的代码变量指示。
推荐阅读
- python - 在 Visual Studio 2017 上的 C++ 文件中包含 python 时出现链接问题
- ncurses - 简单的 ncurses 应用程序对箭头键没有反应
- node.js - 无法向其他地区的 Stripe Connected Account 付款
- java - Spring WebFlux:如何从数据库中将文件作为字节数组返回
- javascript - 提交表单后删除 Formik 错误消息
- python - 关于python的w3w字典练习题的问题
- python - Pygame 没有移动我的矩形,我不知道为什么?
- grpc - grpc-java 定义没有proto文件的服务和方法
- javascript - 如何从 JS 文件调用 Odoo 控制器函数
- oracle - 我的 PL/SQL 代码中存在编译错误