2012-06-20 30 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

哇太棒了!謝謝! (並且也可以幫助格式化我的文章) – PLB

+0

歡迎您;) –