2012-06-20 1 views
3

Я выполняю домашнюю работу в JavaFX2.1, и у меня есть проблема с методом setOnKeyPressed. Мои программы имитируют пианино, поэтому он звучит каждый раз, когда я нажимаю кнопку: «Q» - «do», «W» - «re» и т. Д. ... У меня также есть (на данный момент) мышь вход, который будет отключен позже, так как я не могу воспроизвести сразу несколько заметок ...Отключить автоповторение setOnKeyPressed (JavaFX 2.1)

Моя проблема: если я удерживаю клавишу (на клавиатуре, конечно, не с помощью мыши), ее связанное событие будет запущен в цикле ... Я сделал несколько тестов и заметил, что запускается только setOnKeyPressed, а не setOnKeyReleased.

Я сделал некоторые обходные пути, но они не делают то, что я ожидал:

  • добавить логическое значение, чтобы знать, если ключ был выпущен отключает возможность нажатия на несколько клавиш одновременно.
  • Отключение громкости после воспроизведения звука (и возврат его к значению при отпускании клавиши), похоже, работает, также для нескольких клавиш, НО продолжительность звука значительно короче по сравнению с тем, когда я держу вниз по мыши на той же клавише.

Любые предложения?

+0

Что вы делаете правильно. –

ответ

3

Вы не можете отключить несколько событий, так как это поведение системы. Лучшим решением для вас было бы улучшить логический подход флага для хранения флага для каждого ключа. Например. следующий путь:

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()); 
     } 
    }); 
+0

ничего себе здорово! Спасибо! (andl также за помощь в форматировании моего сообщения) – PLB

+0

добро пожаловать;) –