不使用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所需的灵活性……