我正在使用Metal外观编写Java Swing应用程序。每次我的应用程序中都有JButton时,用户使用Tab键将焦点移动到按钮,然后按Enter键。什么都没发生!如果他按下Space键,则会触发按钮事件。如何指定Enter键以触发与Space键相同的事件?谢谢你的帮助。
答案 0 :(得分:17)
我发现了以下内容:
http://tips4java.wordpress.com/2008/10/25/enter-key-and-button/
Rob Camick写道,在使用JDK5时,您只需添加...
UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
...给应用程序解决问题。这对我有用!我无法想象更简单的事情。但是,当使用旧版本的Java时,你必须做一些像Richard和Peter在这个问题的答案中描述的东西。
答案 1 :(得分:4)
这是完整的例子。理查德很接近,但你还需要将按下的ENTER映射到动作,而不仅仅是释放。为了使它适用于所有按钮,我已将此映射放入按钮的默认输入映射。添加导入,它应该是可以运行的。
public class Main implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Main());
}
@Override
public void run() {
setupEnterActionForAllButtons();
JFrame frame = new JFrame("Button test");
frame.getContentPane().add(createButton(), BorderLayout.NORTH);
frame.getContentPane().add(createButton(), BorderLayout.SOUTH);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void setupEnterActionForAllButtons() {
InputMap im = (InputMap) UIManager.getDefaults().get("Button.focusInputMap");
Object pressedAction = im.get(KeyStroke.getKeyStroke("pressed SPACE"));
Object releasedAction = im.get(KeyStroke.getKeyStroke("released SPACE"));
im.put(KeyStroke.getKeyStroke("pressed ENTER"), pressedAction);
im.put(KeyStroke.getKeyStroke("released ENTER"), releasedAction);
}
private JButton createButton() {
JButton b = new JButton("press enter");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Pressed");
}
});
return b;
}
}
答案 2 :(得分:1)
实际上,这是一个外观和感觉问题。它(并且应该)取决于哪个键触发聚焦按钮的外观和感觉。
“默认按钮”解决方法的工作原理,因为您正在使用的L& F使用输入作为默认按钮。
彼得的解决方法明确改变了L& F默认的“焦点动作”键 - 如果你问我,这个键更有说服力。
我想补充一点,我不认为很多用户会想要选中按钮然后点击输入(大多数人甚至不会注意到焦点指示符) - 他们希望默认操作是“正确的”并且工作他们按哪里进入。这只能通过理查德建议的输入地图来完成。
我肯定建议在更改任何内容之前,先了解用户实际想要和期望的内容(最好是参考他们使用的其他应用)。
答案 3 :(得分:0)
您可以通过为Enter键分配输入/操作映射来完成此操作。如下所示:
// save the command mapping for space
Object spaceMap = button.getInputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true));
// add a mapping from enter to the same command.
button.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true),spaceMap);
答案 4 :(得分:0)
您还可以将“默认按钮”设置为最近聚焦的按钮。
我在一个应用程序上做了这个,所有这样做的方法都是维护和调试的噩梦。事实上,这显然不是Swing设计师想要发生的事情。
答案 5 :(得分:0)
扩展到上面的答案,与收音机,复选框一样。 在创建组件之前调用此方法
void setupEnterAction(String componentName){
String keyName = componentName + ".focusInputMap";
InputMap im = (InputMap) UIManager.getDefaults().get(keyName);
Object pressedAction = im.get(KeyStroke.getKeyStroke("pressed SPACE"));
Object releasedAction = im.get(KeyStroke.getKeyStroke("released SPACE"));
im.put(KeyStroke.getKeyStroke("pressed ENTER"), pressedAction);
im.put(KeyStroke.getKeyStroke("released ENTER"), releasedAction);
}
public void setEnterEvent(){
setupEnterAction("Button");
setupEnterAction("RadioButton");
setupEnterAction("CheckBox");
}