Трудности с сочетанием клавиш JavaFX

#javafx-8

#javafx-8

Вопрос:

Я разрабатываю аудиоплеер с использованием JavaFX. Я недалеко от конца, но у меня возникли некоторые трудности с управлением моими сочетаниями клавиш.

В качестве примера, в главном окне (где находится компонент проигрывателя) я хочу повлиять на «правильную» клавишу, чтобы двигаться вперед в песне :

 SoundLooper.getInstance().getPrimaryStage().getScene().setOnKeyReleased(new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent event) {
        ...
        } else if (event.getCode() == KeyCode.RIGHT) {
            // RIGHT : Move in media  3s
            player.moveMediaTime(3000);
            event.consume();
        ...
    }
  

Это сочетание клавиш назначается непосредственно окну, чтобы быть активным независимо от выделенного поля. Это работает хорошо.

Теперь у меня в этом окне есть поле счетчика для изменения громкости (пользователь может ввести здесь значение от 0 до 100). Я наложил на него фильтр, чтобы принимать только цифры :

 spinnerVolume.addEventFilter(KeyEvent.KEY_TYPED, new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent event) {
        if (!event.getCharacter().matches("[1-9]")) {
            event.consume();
        }
    }
});
  

Я думаю, что при этом клавиши left и rigth больше не будут работать в этом поле spinner, но оно все еще работает. Теперь, когда я набираю правильную клавишу, выполняется 2 действия :

  1. Переместите курсор в счетчик
  2. Продвигайтесь в песне

Я хочу, чтобы правильная клавиша выполнялась независимо от поля фокусировки, но не в том случае, если этот файл может использовать эту клавишу (например, текстовое поле). Как я могу это сделать?

Другой пример. Я хочу, чтобы все диалоговые окна в приложении закрывались, когда пользователь вводит клавишу escape. Я получил диалоговое окно, которое содержит только редактируемый список со списком и кнопку «OK». Я использую тот же код, чтобы повлиять на этот ключ в моем диалоговом окне :

 stage.getScene().setOnKeyReleased(new EventHandler<KeyEvent>() {
    @Override
    public void handle(KeyEvent e) {
        if (e.getCode() == KeyCode.ENTER) {
            validate();
        } else if (e.getCode() == KeyCode.ESCAPE) {
            cancel();
        }
    }
});
  

Если текстовое поле поля со списком сфокусировано, клавиша escape не имеет эффекта (метод «handle» не вызывается). Если я «оставляю» это поле с помощью клавиши TAB, а затем набираю escape, диалоговое окно закрывается нормально.
Если я заменю :

 else if (e.getCode() == KeyCode.ESCAPE)
  

Автор:

 else if (e.getCode() == KeyCode.RIGHT)
  

Всплывающее окно хорошо закрывается при вводе правильной клавиши, даже если текстовое поле сфокусировано…

Я уверен, что я что-то пропустил, кто-нибудь может посоветовать мне лучший способ сделать это?

Спасибо,