在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
}
});
答案 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 ...这很难看,感觉很乱,并且需要处理器密集,但它允许我对这种特殊动态形式所需的灵活性......