Как отслеживать KeyEvent в JavaFX и SceneBuilder

JavaFX, SceneBuilder. Если добавить код ниже в start() - все работает.

scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent e) {
        switch (e.getCode()) {
            case W -> {
                System.out.println("w");
            }
            case A -> System.out.println("a");
            case S -> System.out.println("s");
            case D -> System.out.println("d");
        }
    }
});

Но полагаю подобный код должен находиться все таки в котроллере. Но в контроллере он не реагирует на него.

@FXML
void KeyPressed(KeyEvent event) {
    System.out.println("qwe");
}
@FXML
void MouseClicked(MouseEvent event) {
    System.out.println("asd");
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    bdPane.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent keyEvent) {
            System.out.println("test");
        }
    });
}
  1. Если указать функцию KeyPressed в SceneBuilder - ничего не происходит. Притом, если добавить MouseClicked - все работает отлично. Метки в fxml добавлены. Пробовал разные варианты - на borderPane/gridPane
  2. Попытался через интерфейс Initializable - сама функция отрабатывает, но код handle - нет.

Правильно ли понимаю - вешать KeyEvent на НЕ изменяемые объекты нельзя? Спорное утверждение, т.к. если нарисовать скажем прямоугольник, к нему указать функцию, которая, например, должна его передвигать по нажатиям с клавиатуры, тоже ничего не происходит.

Как вешать обработки событий клавиатуры, если мне не надо что-то вводить, а просто реализовать какую-то логику в программе?


Ответы (1 шт):

Автор решения: DostoevskyFM
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    rect.focusTraversableProperty().set(true);
    rect.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent e) {
            switch (e.getCode()) {
                case W -> System.out.println("w");
                case A -> System.out.println("a");
                case S -> System.out.println("s");
                case D -> System.out.println("d");
            }
        }
    });
}

focusTraversableProperty() - устанавливает должен ли узел находится в цикле обхода фокуса. После этого все отрабатывает отлично.

Insolor - спасибо за подсказку Ж)

→ Ссылка