Отключить автоматическое повторение 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());
        }
    });
Другие вопросы по тегам