不使用alt键的jButton的快捷键

在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 } }); 

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

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

再加上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 ); 

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