在 Nimbus L&F 中,当按下 Enter 键时,如果一个按钮具有焦点,则无论另一个按钮是否已设置为默认值,都会单击该按钮,如下所示:
getRootPane().setDefaultButton(myButton);
此外,使用键绑定不起作用:
Action clickDefault = new AbstractAction("clickDefault") {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Got Here");
getRootPane().getDefaultButton().doClick();
}
};
InputMap im = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
KeyStroke enter = KeyStroke.getKeyStroke("ENTER");
im.put(enter, "defaultButton");
getRootPane().getActionMap().put("defaultButton", clickDefault);
我什至从未看到“到达这里”消息,但如果我绑定到另一个 KeyStroke,例如“P”,它会按预期运行。因此,似乎 Enter 键在到达此事件处理程序之前已被捕获。
我还尝试修改 UIDefaults:
im = (InputMap) UIManager.getDefaults().get("Button.focusInputMap");
im.put(enter, null);
im.put(enterRelease, null);
那也失败了。任何人有任何想法如何做到这一点?
---更新---
进一步调查显示,JButton 的 InputMap 包含 {"pressed Enter": "pressed", "released ENTER": "released"} (以及 SPACE 的绑定)。相关组件的键绑定具有比 RootPane 更高的优先级。有关解决问题的代码,请参见下面的答案。