JavaFX EventHandler не меняет значение полей
Есть два класса. Application:
public class MainWindowApplication extends Application {
MainWindowController mwc = new MainWindowController();
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(MainWindowApplication.class.getResource("main-view.fxml"));
Scene scene = new Scene(fxmlLoader.load());
scene.setOnKeyPressed(mwc);
scene.addEventFilter(KeyEvent.KEY_PRESSED, mwc);
stage.setTitle("Snake");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
и Controller:
public class MainWindowController implements EventHandler<KeyEvent> {
private boolean moveUp;
private boolean moveDown;
private boolean moveRight;
private boolean moveLeft;
public void initialize() {
init();
start();
}
void start() {
Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(2), ev -> {
move();
repaint();
}));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();
System.out.println(moveUp);
}
public void init() {
//TODO
}
public void move() {
if (moveUp) {
System.out.println("MOVE UP");
}
if (moveDown) {
System.out.println("MOVE DOWN");
}
if (moveLeft) {
System.out.println("MOVE LEFT");
}
if (moveRight) {
System.out.println("MOVE RIGHT");
}
}
public void repaint(){
//TODO
}
@Override
public void handle(KeyEvent KeyEvent) {
switch (KeyEvent.getCode()) {
case UP:
System.out.println("UP");
moveUp = true;
break;
case LEFT:
System.out.println("LEFT");
moveLeft = true;
break;
case RIGHT:
System.out.println("RIGHT");
moveRight = true;
break;
case DOWN:
System.out.println("DOWN");
moveDown = true;
break;
}
}
}
Проблема в том, что EventHandler обрабатывает события не так, как мне нужно. При нажатии на кнопки клавиатуры, текстовые сообщения из метода handle выводятся в консоль, т.е нажатия передаются в программу, но значение boolean полей класса остаются неизменными (false), соответственно метод move не работает. Не могу понять где ошибка.
Ответы (1 шт):
Автор решения: Alexey
→ Ссылка
Создал Enum вместо boolean переменных
public enum Move {
UP,
DOWN,
LEFT,
RIGHT
}
public class MainWindowController implements EventHandler<KeyEvent> {
static Move move = Move.RIGHT;
@Override
public void handle(KeyEvent KeyEvent) {
if (KeyEvent.getCode() == KeyCode.UP) {
System.out.println("UP");
move = Move.UP;
}
if (KeyEvent.getCode() == KeyCode.DOWN) {
System.out.println("DOWN");
move = Move.DOWN;
}
if (KeyEvent.getCode() == KeyCode.LEFT) {
System.out.println("LEFT");
move = Move.LEFT;
}
if (KeyEvent.getCode() == KeyCode.RIGHT) {
System.out.println("RIGHT");
move = Move.RIGHT;
}
}
и проблема решилась. Почему не работал первоначальный вариант так и не понял.