#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 действия :
- Переместите курсор в счетчик
- Продвигайтесь в песне
Я хочу, чтобы правильная клавиша выполнялась независимо от поля фокусировки, но не в том случае, если этот файл может использовать эту клавишу (например, текстовое поле). Как я могу это сделать?
Другой пример. Я хочу, чтобы все диалоговые окна в приложении закрывались, когда пользователь вводит клавишу 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)
Всплывающее окно хорошо закрывается при вводе правильной клавиши, даже если текстовое поле сфокусировано…
Я уверен, что я что-то пропустил, кто-нибудь может посоветовать мне лучший способ сделать это?
Спасибо,