【问题标题】:Java Listen to Button and Keyboard clickJava 听按钮和键盘点击
【发布时间】:2012-03-08 00:39:04
【问题描述】:

如何监听按键并触发 JButton?

例如:

我将“A”JButton 作为面板上的 GUI。我在“aButton”上实现了一个 buttonListener,它将屏幕更改为其他内容。我希望通过鼠标单击和键盘按下来触发此按钮。

如何在实现 buttonListener 的同时按键盘上的“a”来触发这个“A”JButton?

我当前的代码无法触发按键事件。

ButtonListener listener;
KeyboardListener keyboardListener;
private JButton aButton;

public MyButtonPanel() {
    listener = new ButtonListener();

    aButton = new JButton ("A");
    aButton.setFont (BUTTON_TEXT);
    aButton.setPreferredSize (new Dimension (60,30));
    aButton.addActionListener (listener);
    aButton.addKeyListener (keyboardListener);

    setLayout (new BorderLayout());
    add (aButton, BorderLayout.CENTER);

}

private class KeyboardListener implements KeyListener
{
    public void keyPressed(KeyEvent arg0) {
        char c = arg0.getKeyChar();
        System.out.println("Pressed " + c);
    }

    public void keyReleased(KeyEvent arg0) {
        char c = arg0.getKeyChar();
        System.out.println("Released " + c);
    }

    public void keyTyped(KeyEvent arg0) {
        char c = arg0.getKeyChar();
        System.out.println("Typed " + c);
    }

}

 private class ButtonListener implements ActionListener {
  public void actionPerformed (ActionEvent event) {
    Object source = event.getSource();

    if (source == aButton) {
        System.out.println("This is a");
    }
  }
 }

}

【问题讨论】:

标签: java swing keyboard jbutton actionlistener


【解决方案1】:

创建一个动作。然后使用 ActionListener 将 Action 添加到按钮。然后通过将 Action 绑定到 KeyStroke 来处理键盘事件。

阅读Swing tutorial。有以下部分:

  1. 如何使用操作
  2. 如何使用键绑定

让你开始。

或者您也可以只为按钮分配助记符来调用按钮。阅读 JButton API。

【讨论】:

  • 我的错,刚刚看了你的最后一行。只是我现在不能删除我的答案,我的错。它说我今天不能删除我的答案。为信息 +1。
【解决方案2】:

还有另一种方法可以实现您想要的,只需将注释行添加到您的代码部分。

aButton = new JButton ("A");
aButton.setFont (BUTTON_TEXT);
// Doing this will also allow you to use your Keyboard for this JButton. You have to 
// press ALT+A in this case to make it work.
//aButton.setMnemonic(KeyEvent.VK_A);

如果您只有一个 Button,那么您也可以在这种情况下将该按钮设为默认 JButton,方法是这样做:

yourFrameObject.getRootPane().setDefaultButton(aButton);

现在按下 Enter 键,它将按照其 actionPerformed() 方法中的描述执行工作。

注意:默认按钮功能的具体实现取决于外观。例如,在 Windows 外观中,默认按钮会更改为具有焦点的按钮,因此按 Enter 会单击焦点按钮。当没有按钮获得焦点时,原先指定为默认按钮的按钮再次变为默认按钮。

【讨论】:

  • 感谢您的信息.. 很抱歉这个基本问题:有没有办法在不按 ALT 的情况下激活助记符?
  • @nowhere :似乎 KeyBinding 就是解决这个问题的方法。或者,如果它只是您关心的一个按钮,请将该按钮设为您的默认按钮,如我的答案下部所述。将您的按钮设为默认设置,只需按一下 ENTER 键即可使用。只是我的回答中提到的那一行将为您解决这个问题。助记符是用来和 ALT 一起工作的,我猜 :-)
  • 我明白了。好的,我会看看 KeyBinding 并在代码上尝试一下。我需要实现超过 1 个按钮。这只是开始。 :) 但是感谢默认按钮的解释。
【解决方案3】:

使用键绑定来将回车键与特定组件绑定。 在您的情况下,您可以使用

aButton.getInputMap().put(KeyStroke.getKeyStroke("ENTER"),"pressed");
aButton.getActionMap().put("pressed",btnAction);

其中pressed 是将特定组件与btnAction 链接的关键字,btnAction 是对Action 的引用。可以使用AbstractAction() 创建一个操作,您可以在其中指定要执行的操作。 如果您希望相同的组件响应鼠标单击,您可以使用该方法

aButton.addActionListener(btnAction);

由于Action 是从ActionListener 接口扩展而来,因此不会造成问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多