【问题标题】:How to make JButton react to keypressed method?如何让 JButton 对按键方法做出反应?
【发布时间】:2018-12-28 12:14:51
【问题描述】:

我在 Netbeans 中使用 JFrame Form 来制作一个简单的钢琴游戏,我希望能够使用计算机键盘按键来控制 JButtons。当我想在设计选项中使用ActionPerformed 方法和keypressed 时,它只能让我控制之前用鼠标单击的按钮。其他按钮没有反应。 我试图通过让keypressed 自己编写来解决它,但在这种情况下,当我按下键盘键时没有任何反应。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    String soundName = "C.wav";
    AudioInputStream audioInputStream = null;
    try {
        audioInputStream = AudioSystem.getAudioInputStream(new
                File(soundName).getAbsoluteFile());
    } catch (UnsupportedAudioFileException | IOException ex) {
        Logger.getLogger(GameWindow.class.getName()).log(Level.SEVERE, null, ex);
    }
    Clip clip = null;
    try {
        clip = AudioSystem.getClip();
    } catch (LineUnavailableException ex) {
        Logger.getLogger(GameWindow.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
        clip.open(audioInputStream);
    } catch (LineUnavailableException | IOException ex) {
        Logger.getLogger(GameWindow.class.getName()).log(Level.SEVERE, null, ex);
    }
    clip.start();
}
public void keyPressed(KeyEvent evt){
    int keyCode = evt.getKeyCode();
    if (keyCode == KeyEvent.VK_Z) {
        jButton1.getModel().isPressed();
    }
    if (keyCode == KeyEvent.VK_S) {
        jButton2.getModel().isPressed();
    }
}

【问题讨论】:

  • 尝试通过调用JFrame实例的addKeyListener方法注册一个KeyListener

标签: java swing jframe jbutton piano


【解决方案1】:

您可以使用 Swing 键绑定来实现此目的。试试下面的例子。 InputMap和ActionMap的使用是这个例子的亮点。

import javax.swing.*;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;

public class ClickButtonsThroughKeyboard
{
  private static Action buttonOneClickAction = new ButtonOneClickAction();
  private static Action buttonTwoClickAction = new ButtonTwoClickAction();

  public static void main(String[] args)
  {
    JButton button1 = new JButton("One");
    button1.addActionListener(buttonOneClickAction);

    button1.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('z'), "z_typed");
    button1.getActionMap().put("z_typed", buttonOneClickAction);

    JButton button2 = new JButton("Two");
    button2.addActionListener(buttonTwoClickAction);

    button2.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke('s'), "s_typed");
    button2.getActionMap().put("s_typed", buttonTwoClickAction);

    JFrame f = new JFrame("Click Button Programmatically");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().setLayout(new FlowLayout());
    f.getContentPane().add(button1);
    f.getContentPane().add(button2);
    f.setBounds(300, 200, 400, 300);
    f.setVisible(true);
  }
}

class ButtonOneClickAction extends AbstractAction
{
  @Override
  public void actionPerformed(ActionEvent e)
  {
    System.out.println("Button One clicked");
  }
}

class ButtonTwoClickAction extends AbstractAction
{
  @Override
  public void actionPerformed(ActionEvent e)
  {
    System.out.println("Button Two clicked");
  }
}

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 2021-05-12
    • 2013-03-27
    • 2015-01-27
    • 2021-09-10
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多