java:在不关注按钮的情况下触发KeyEvent,或在多个按钮上应用关注来触发KeyEvent

java:在不关注按钮的情况下触发KeyEvent,或在多个按钮上应用关注来触发KeyEvent,java,swing,netbeans,keyboard,keyevent,Java,Swing,Netbeans,Keyboard,Keyevent,我正在做一个鼓的应用程序,它有按钮作为我的鼓。我想要的是按键会在按键时触发,这样用户就可以用键盘击鼓了 我正在使用按钮的keyTyped事件来使用键执行声音。它的工作原理很好,但首先焦点需要在特定的按钮上,因此我不能在按键时触发这些单独的按钮,因为焦点只在一个按钮上 private void btnBassDrumKeyTyped(java.awt.event.KeyEvent evt) { if(evt.getKey

我正在做一个鼓的应用程序,它有按钮作为我的鼓。我想要的是按键会在按键时触发,这样用户就可以用键盘击鼓了

我正在使用按钮的keyTyped事件来使用键执行声音。它的工作原理很好,但首先焦点需要在特定的按钮上,因此我不能在按键时触发这些单独的按钮,因为焦点只在一个按钮上

private void btnBassDrumKeyTyped(java.awt.event.KeyEvent evt) {                                     
  if(evt.getKeyChar() == KeyEvent.VK_V){

        try{
                music=new FileInputStream(new File(bassSound));
                AudioStream audios=new AudioStream(music);
                AudioPlayer.player.start(audios);
                }
                catch(Exception e){
                    JOptionPane.showMessageDialog(null,e.getLocalizedMessage());
                }     
   }
}
我能想到的解决方案是:在表单加载上应用多个焦点(如果可能的话),在按键时使用不同的方式触发按钮事件(而不是通过KeyListener和KeyEvent)


你们知道如何实现这些解决方案吗?或者如果你们有自己的解决方案,你们能教我吗?谢谢大家!:)

谢谢大家@高尔布尔斯,@camickr@MadProgrammer

是的,似乎钥匙扣就是确切的答案

bassDrumAction = new AbstractAction() {
         @Override
         public void actionPerformed(ActionEvent e) {
             try{
                    music=new FileInputStream(new File("C:\\Users\\AMMUYUTAN\\Documents\\Java Specialization Course\\CS182P\\AudioSync\\src\\sound\\KickSound.WAV"));
                    AudioStream audios=new AudioStream(music);
                    AudioPlayer.player.start(audios);
                    }
                    catch(Exception ex){
                        JOptionPane.showMessageDialog(null,ex.getLocalizedMessage());
                    }
            }
        };
InputMap inputMap = btnBassDrum.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
          inputMap.put(KeyStroke.getKeyStroke("B"), "hitBassDrum");
          btnBassDrum.getActionMap().put("hitBassDrum", bassDrumAction);

谢谢大家@高尔布尔斯,@camickr@MadProgrammer

是的,似乎钥匙扣就是确切的答案

bassDrumAction = new AbstractAction() {
         @Override
         public void actionPerformed(ActionEvent e) {
             try{
                    music=new FileInputStream(new File("C:\\Users\\AMMUYUTAN\\Documents\\Java Specialization Course\\CS182P\\AudioSync\\src\\sound\\KickSound.WAV"));
                    AudioStream audios=new AudioStream(music);
                    AudioPlayer.player.start(audios);
                    }
                    catch(Exception ex){
                        JOptionPane.showMessageDialog(null,ex.getLocalizedMessage());
                    }
            }
        };
InputMap inputMap = btnBassDrum.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
          inputMap.put(KeyStroke.getKeyStroke("B"), "hitBassDrum");
          btnBassDrum.getActionMap().put("hitBassDrum", bassDrumAction);

键绑定是您需要的-/支持使用鼠标或键盘调用动作的简单示例:如何创建使用键绑定播放声音的动作?抱歉,我在这方面还不太好。我正在使用Netbeans btw@camickr。你已经说过,如果组件有焦点,它就可以工作。因此,您只需使用上面发布的代码创建一个操作。然后为“V”键添加一个键绑定。我给你的链接展示了如何创建一个通用操作并将其绑定到数字0-9。概念是一样的。然后动作和击键将不同。键绑定是您需要的-/支持使用鼠标或键盘调用动作的简单示例:如何创建使用键绑定播放声音的动作?抱歉,我在这方面还不太好。我正在使用Netbeans btw@camickr。你已经说过,如果组件有焦点,它就可以工作。因此,您只需使用上面发布的代码创建一个操作。然后为“V”键添加一个键绑定。我给你的链接展示了如何创建一个通用操作并将其绑定到数字0-9。概念是一样的。然后,操作和按键将不同。