В 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);
Я даже не вижу сообщения "Got Here", хотя, если я связываюсь с другим KeyStroke, таким как "P", оно функционирует должным образом. Так что может показаться, что ключ Enter захватывается до того, как он попадет в этот обработчик событий.
Я также пытался изменить UIDefaults:
im = (InputMap) UIManager.getDefaults().get("Button.focusInputMap");
im.put(enter, null);
im.put(enterRelease, null);
Это тоже не удалось. У кого-нибудь есть идеи, как этого добиться?
--- Обновление ---
Дальнейшие исследования показали, что InputMap для JButton содержит {"нажатый Enter": "нажатый", "освобожденный ENTER": "освобожденный"} (а также привязки для пробела). Привязка клавиш рассматриваемого компонента имеет более высокий приоритет, чем корневая панель. Смотрите мой ответ ниже для кода, который решает проблему.