Как мне назначить Enter как ключ триггера всех JButton в моем приложении Java?
Вопрос
Я пишу приложение на Java Swing с использованием внешнего вида Metal. Каждый раз, когда в моем приложении появляется JButton, пользователь использует клавишу Tab, чтобы переместить фокус на кнопку, а затем нажимает клавишу Enter. Ничего не произошло! Если он нажимает клавишу пробела, запускаются события кнопки. Как назначить клавишу Enter для запуска тех же событий, что и клавиша пробела? Спасибо за вашу помощь.
Решение
Я обнаружил следующее:
http://tips4java.wordpress.com/2008 / 10/25 / ввести ключ-и-кнопки /
Где Роб Кэмик пишет, что при использовании JDK5 и более поздних версий вы просто добавляете ...
UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
... в приложение для решения проблемы. Это помогло мне! И я не могу представить ничего проще. Однако при использовании более старых версий Java вам нужно будет что-то вроде того, что Ричард и Питер описывают в своих ответах на этот вопрос.
Другие советы
Вот полный пример. Ричард был близок, но вам также нужно сопоставить нажатие клавиши ВВОД с действием, а не просто отпустить. Чтобы заставить это работать для ВСЕХ кнопок, я поместил это отображение в карту ввода по умолчанию для кнопок. Добавьте импорт, и он должен быть запущен.
<Ч>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;
}
}
На самом деле, это вопрос внешнего вида. Это (и должно быть) зависит от того, какая клавиша вызывает фокусированную кнопку.
Кнопка " по умолчанию " Обходной путь работает, поскольку используемый вами L & amp; F использует кнопку ввода по умолчанию.
Временное решение Питера явно изменяет L & amp; F по умолчанию " фокусное действие " ключ - что несколько более убедительно, если вы спросите меня.
Я бы добавил, что я не думаю, что многие пользователи захотят перейти на кнопку, а затем нажать клавишу ввода (большинство даже не заметят индикатор фокуса) - они хотят, чтобы действием по умолчанию было " вправо " один и работать везде, где они нажимают ввод. Это можно сделать только с помощью входных карт, как предлагает Ричард.
Я бы, конечно, предложил получить очень четкое представление о том, чего на самом деле хотят и ожидают ваши пользователи (желательно со ссылкой на другие приложения, которые они используют), прежде чем что-либо менять в глобальном масштабе.
Вы делаете это, назначая карту ввода / действия для клавиши 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);
Вы также можете установить кнопку " по умолчанию " на кнопку, которая была недавно сфокусирована.
Я сделал это в приложении, и все способы сделать это - кошмар для обслуживания и отладки. Дело в том, что это явно не то, что планировали дизайнеры Swing.
Расширение вышеупомянутых ответов, чтобы сделать то же самое с радио, флажки. Вызывается это перед созданием компонентов
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");
}