Отключить автоматическое повторение setOnKeyPressed (JavaFX 2.1)
Я делаю домашнюю работу в JavaFX2.1, и у меня есть проблема с setOnKeyPressed
метод. Мои программы имитируют пианино, поэтому он издает звук каждый раз, когда я нажимаю на кнопку: "Q" - это "делать", "W" - это "ре" и т. Д. У меня также есть (пока) вход для мыши, который будет отключен позже, так как я не могу играть несколько нот одновременно с ним...
Моя проблема: если я удерживаю клавишу (на клавиатуре, конечно, не с помощью мыши), ее связанное событие будет вызвано в цикле... Я сделал несколько тестов и заметил, что только setOnKeyPressed
срабатывает, а не setOnKeyReleased.
Я сделал несколько обходных путей, но они не делают то, что я ожидаю:
- добавление логического значения, чтобы узнать, была ли отпущена клавиша, отключает возможность нажатия нескольких клавиш одновременно.
- отключение громкости после воспроизведения звука (и возврат его к значению при отпускании клавиши), кажется, работает, также для нескольких клавиш, НО продолжительность звука значительно короче по сравнению с тем, когда я удерживаю мышь на том же ключе.
Какие-либо предложения?
1 ответ
Вы не можете отключить несколько событий, так как это поведение системы. Лучшим решением для вас было бы улучшить подход с использованием логического флага для хранения флага для каждого ключа. Например, следующим образом:
final Set<String> pressedKeys = new HashSet<String>();
keyboard.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
String note = t.getText();
if (!pressedKeys.contains(note)) {
// you may need to introduce synchronization here
pressedKeys.add(note);
playNote(note);
}
}
});
keyboard.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
pressedKeys.remove(t.getText());
}
});