2013-04-26 64 views
1

我有一個MIDI鋼琴程序,當鼠標在筆記上單擊或鍵入某個特定鍵盤鍵時,會觸發一個音符播放。我希望keyPressed事件的行爲方式與mousePressed事件的行爲相同,觸發按鍵時按下一次音符。java keyPressed事件在按下按鍵時保持觸發

但是,當按鍵仍然按下時,它會一直播放音符。我已經看過關於這個主題的一些主題,但我仍然不知道如何解決這個問題(我沒有完全理解我可以如何應用其他方法)。

這裏是keyPressed代碼我現在有:

@Override 
    public void keyPressed(KeyEvent ke) { 
     if(ke.getKeyCode() == KeyEvent.VK_Z) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[0]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_X) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[1]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_C) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[2]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_V) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[3]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_B) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[4]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_N) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[5]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_M) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[6]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_COMMA) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[7]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_PERIOD) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[8]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_SLASH) 
     { 
      channel.noteOn (((WhiteKey) WhiteKeys[9]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_S) 
     { 
      channel.noteOn (((BlackKey) BlackKeys[0]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_D) 
     { 
      channel.noteOn (((BlackKey) BlackKeys[1]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_G) 
     { 
      channel.noteOn (((BlackKey) BlackKeys[2]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_H) 
     { 
      channel.noteOn (((BlackKey) BlackKeys[3]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_J) 
     { 
      channel.noteOn (((BlackKey) BlackKeys[4]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_L) 
     { 
      channel.noteOn (((BlackKey) BlackKeys[5]).getNote(), 127); 
     } 

     else if(ke.getKeyCode() == KeyEvent.VK_SEMICOLON) 
     { 
      channel.noteOn (((BlackKey) BlackKeys[6]).getNote(), 127); 
     } 
    } 
+0

如何實現keyDown呢? – 2013-04-26 17:34:22

+0

謝謝你的迴應!請原諒我的無知,但是如何實現keyDown,因爲它不是KeyListener接口的一部分?我也需要在keyListener接口中使用keyReleased方法。 – AFinch 2013-04-26 17:57:52

回答

1

我找不到按下此鍵時會觸發一次的事件。但是,您可以使用按鍵時設置的布爾值,並且只有在釋放鍵時纔會重置。然後,只有在布爾值爲假時纔可以播放MIDI音調,每次擊鍵只會播放一次。

boolean zPressed = false; 

public void keyPressed(KeyEvent ke) { 
    if(ke.getKeyCode() == KeyEvent.VK_Z) 
    { 
     if (!zPressed) { 
      channel.noteOn (((WhiteKey) WhiteKeys[0]).getNote(), 127); 
      zPressed = true; 
     } 
    } 
    } 

public void keyReleased(KeyEvent ke) { 
    if(ke.getKeyCode() == KeyEvent.VK_Z) 
    { 
     zPressed = false; 
    } 
+0

很高興我能幫到你。請標記爲正確的答案。 :) – user0 2013-04-26 18:35:57

+0

請勿使用KeyListener。相反,你應該使用[Key Bindings](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)。然後布爾值是鍵綁定使用的Action的一部分。 – camickr 2013-04-26 19:48:53

相關問題