jButton的快捷键,不使用alt键

时间:2010-11-21 22:23:01

标签: java swing

在SWT中,只需在按钮标签中的字母前添加&即可为任何按钮指定快捷键。例如,如果我的按钮标签是&Play,我可以通过按键盘上的p来激活按钮。

在Swing中,您可以使用mnemonic属性添加快捷键。但是,您需要点击alt+p以激活该按钮。这非常适合菜单快捷方式。我想用字母按下并没有alt修饰符激活按钮。

我看过这篇关于如何做的帖子,但看起来很荒谬。有更简单的方法吗?

http://linuxjavaprogrammer.blogspot.com/2008/01/java-swing-jbutton-keyboard-shortcuts.html

更新:在@camickr建议之后,我最终使用了此代码。我在网上找不到任何清晰简单的例子,所以希望这会帮助人们。

// play is a jButton but can be any component in the window
play.getInputMap(play.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_P, 0), "play");
play.getActionMap().put("play", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
  playActionPerformed(e);  // some function
}
});

3 个答案:

答案 0 :(得分:5)

是的,Swing旨在使用Key Bindings。因此,不是向按钮添加ActionListener而是添加Action。然后可以通过按钮或菜单项共享该Action。您还可以使用KeyBindings分配任意数量的KeyStrokes来调用Action。本教程还有一个关于动作的部分,解释了为什么使用动作是有益的。

JComponent有一个registerKeyboardAction(...)方法,它基本上为你做了InputMap / ActionMap绑定,但是它也必须将ActionListener包装在一个包装器Action中,所以你最喜欢自己绑定它。

答案 1 :(得分:1)

除了camickr的回答之外,我现在正在使用这样的小实用功能:

public static void clickOnKey(
    final AbstractButton button, String actionName, int key )
{
    button.getInputMap( JButton.WHEN_IN_FOCUSED_WINDOW )
        .put( KeyStroke.getKeyStroke( key, 0 ), actionName );

    button.getActionMap().put( actionName, new AbstractAction()
    {
        @Override
        public void actionPerformed( ActionEvent e )
        {
            button.doClick();
        }
    } );
}

现在为我按钮设置键盘快捷键:

clickOnKey( playButton, "play", KeyEvent.VK_P );

答案 2 :(得分:0)

我遇到了类似的动态构造(基于数据输入)形式的问题,最后将keyListener动作附加到按钮上。在表单构造中,我解析按钮的组件树并附加监听器。监听器还会解析树并将按键与相应的按钮(通过按钮中的文本)匹配,因为我不知道哪一个会在任何给定时间有焦点,并触发按钮doClick ...这很难看,感觉很乱,并且需要处理器密集,但它允许我对这种特殊动态形式所需的灵活性......