В приложении Java не работают нажатие клавиш для обработки событий

Рейтинг: 1Ответов: 1Опубликовано: 04.03.2025

Есть приложение Java, в котором нужно провести обработку событии по нажатию определенных клавиш, само приложение запускается, но на нажатии этих клавиш никак не реагирует, вопрос почему? добавил даже логгер чтобы обрабатывал события, но это никак не помогло

public class Controller {

private static final Logger logger = Logger.getLogger(Controller.class.getName());

@FXML
void keyPressed(KeyEvent event) throws IOException {
    event.consume();

    logger.info("Клавиша нажата: " + event.getCode());
    if (event.getCode().equals(KeyCode.T)) {
        Habitat.getInstance().timeFlag = !Habitat.getInstance().timeFlag;
        Habitat.getInstance().showTimeLabel();
    } else if (event.getCode().equals(KeyCode.B)) {
        if (!Habitat.startFlag) {
            Habitat.getInstance().startAction();
        }
    } else if (event.getCode().equals(KeyCode.E)) {
        if (Habitat.startFlag) {
            Habitat.getInstance().stopAction();
        }
    }
}

Если нужно, то кусок fxml с кодом основного окошка прилагается:

<AnchorPane focusTraversable="true" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" onKeyReleased="#keyPressed"
        prefHeight="750.0" prefWidth="900.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1"
        fx:controller="com.example.teststststs.Controller">
<Pane fx:id="modelPane" onKeyReleased="#keyPressed" prefHeight="750.0" prefWidth="900.0"/>
<Pane onKeyReleased="#keyPressed" prefHeight="717.0" prefWidth="900.0">

Ответы

▲ 0Принят

Потому, что обработчик события не установлен, или установлен неправильно. Логгер тут бесполезен если метод keyPressed() не вызывается никогда.

Удобные методы регистрации обработчиков событий для событий клавиатуры включают setOnKeyPressed() и setOnKeyReleased(). В следующем примере показан способ установки этих обработчиков событий.

Примеры обработчиков событий для событий клавиатуры:

final TextField textBox = new TextField();
textBox.setPromptText("Напиши здесь");

textBox.setOnKeyPressed(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
System.out.println("Клавиша нажата: " + ke.getText());
}
});

textBox.setOnKeyReleased(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
System.out.println("Клавиша отпущена: " + ke.getText());
}
});

Более подробно об обработчиках событий можно прочитать в JavaFX Tutorial.