2013-04-27 57 views
0

我通过关于如何使用键绑定的教程,我已经使用它们,但现在的情况是不同的。我有一个钢琴卷,其中的按键对应于键盘按键。我需要使用keyPressed和keyReleased方法来知道何时停止和开始钢琴音符。java - Can Keybinders实现keyPressed和keyReleased方法?

编辑:

这里得到答案后,工作代码:

在JLayeredPane的构造:

 InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
     ActionMap am = getActionMap(); 
     mapKeyboard(im, am); 

和方法和类各自的keyPressed /调用keyReleased操作:

public void mapKeyboard(InputMap im, ActionMap am) 
    { 
     int count = 0; 
     for(int j = 0; j<10; j++) 
     { 
      im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, false), "KeyDown" + count + ""); 
      im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, true), "KeyUp" + count + ""); 

      am.put("KeyDown" + count + "", new WhiteKeyDown(count, j)); 
      am.put("KeyUp" + count + "", new WhiteKeyUp(count, j)); 
      count++; 
     } 

     for(int j = 0; j<7; j++) 
     { 
      im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, false), "KeyDown" + count + ""); 
      im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, true), "KeyUp" + count + ""); 

      am.put("KeyDown" + count + "", new BlackKeyDown(count, j)); 
      am.put("KeyUp" + count + "", new BlackKeyUp(count, j)); 
      count++; 
     } 

     for(int j = 10; j<17; j++) 
     { 
      im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, false), "KeyDown" + count + ""); 
      im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, true), "KeyUp" + count + ""); 

      am.put("KeyDown" + count + "", new WhiteKeyDown(count, j)); 
      am.put("KeyUp" + count + "", new WhiteKeyUp(count, j)); 
      count++; 
     } 

     for(int j = 7; j<12; j++) 
     { 
      im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, false), "KeyDown" + count + ""); 
      im.put(KeyStroke.getKeyStroke(KeyCodes[count], 0, true), "KeyUp" + count + ""); 

      am.put("KeyDown" + count + "", new BlackKeyDown(count, j)); 
      am.put("KeyUp" + count + "", new BlackKeyUp(count, j)); 
      count++; 
     } 

    } 


    class WhiteKeyDown extends AbstractAction 
    { 
     int index; 

     public WhiteKeyDown(int i, int j) 
     { 
      super("KeyDown" + i + ""); 
      index = j; 
      putValue(Action.NAME, "KeyDown" + i + ""); 
      putValue(ACTION_COMMAND_KEY, "KeyDown" + i + ""); 
     } 

     @Override 
     public void actionPerformed(ActionEvent ke) { 
      if(isWhiteDown[index] == false) 
      { 
       channel.noteOn (((WhiteKey) WhiteKeys[index]).getNote(), 127); 
       isWhiteDown[index] = true; 
       WhiteKeys[index].setBackground(Color.LIGHT_GRAY); 
       Key key = (Key) WhiteKeys[index]; 
       CreateOnEvent(key); 
      } 
     } 
    } 

    class WhiteKeyUp extends AbstractAction 
    { 
     int index; 

     public WhiteKeyUp(int i, int j) 
     { 
      super("KeyUp" + i + ""); 
      index = j; 
      putValue(Action.NAME, "KeyUp" + i + ""); 
      putValue(ACTION_COMMAND_KEY, "KeyUp" + i + ""); 
     } 

     @Override 
     public void actionPerformed(ActionEvent ke) { 
      if(isWhiteDown[index] == true) 
      { 
       channel.noteOff (((WhiteKey) WhiteKeys[index]).getNote(), 127); 
       isWhiteDown[index] = false; 
       WhiteKeys[index].setBackground(Color.WHITE); 
       Key key = (Key) WhiteKeys[index]; 
       CreateOffEvent(key); 
      } 
     } 
    } 

    class BlackKeyDown extends AbstractAction 
    { 
     int index; 

     public BlackKeyDown(int i, int j) 
     { 
      super("KeyDown" + i + ""); 
      index = j; 
      putValue(Action.NAME, "KeyDown" + i + ""); 
      putValue(ACTION_COMMAND_KEY, "KeyDown" + i + ""); 
     } 

     @Override 
     public void actionPerformed(ActionEvent ke) { 
      if(isBlackDown[index] == false) 
      { 
       channel.noteOn (((BlackKey) BlackKeys[index]).getNote(), 127); 
       isBlackDown[index] = true; 
       BlackKeys[index].setBackground(Color.DARK_GRAY); 
       Key key = (Key) BlackKeys[index]; 
       CreateOnEvent(key); 
      } 
     } 
    } 

    class BlackKeyUp extends AbstractAction 
    { 
     int index; 

     public BlackKeyUp(int i, int j) 
     { 
      super("KeyUp" + i + ""); 
      index = j; 
      putValue(Action.NAME, "KeyUp" + i + ""); 
      putValue(ACTION_COMMAND_KEY, "KeyUp" + i + ""); 
     } 

     @Override 
     public void actionPerformed(ActionEvent ke) { 
      if(isBlackDown[index] == true) 
      { 
       channel.noteOff (((BlackKey) BlackKeys[index]).getNote(), 127); 
       isBlackDown[index] = false; 
       BlackKeys[index].setBackground(Color.BLACK); 
       Key key = (Key) BlackKeys[index]; 
       CreateOffEvent(key); 
      } 
     } 
    } 
+1

是的,你可以拥有的keyPressed和的keyReleased不同的动作。 – camickr 2013-04-27 01:53:36

回答

3
+0

谢谢你,在我看到你发布之前,我想清楚了。尽管如此,非常感谢! 下面是结果代码: im.put(KeyStroke.getKeyStroke(KeyEvent.VK_Z,0,false),“ZKeyDown”); (KeyStroke.getKeyStroke(KeyEvent.VK_Z,0,true),“ZKeyUp”); \t \t \t \t \t piano.getActionMap()把( “ZKeyDown”,新ZKeyDown( “ZKeyDown”))。 (“ZKeyUp”,new ZKeyUp(“ZKeyUp”)); (当然也有抽象类) – AFinch 2013-04-27 02:30:01

+0

@AFinch,用代码更新你的问题。我们无法阅读评论中发布的代码。 – camickr 2013-04-27 03:15:32

+0

哎呀,对不起。我将很快实施,我会发布,因为它比这更好。 – AFinch 2013-04-27 03:50:18