Сочетание клавиш для jButton без использования клавиши alt
В SWT вы можете дать любой кнопке комбинацию клавиш, просто добавив & перед буквой в метке кнопки. Например, если моя метка кнопки &Play, я могу активировать кнопку, нажав букву p на клавиатуре.
В Swing можно добавить комбинацию клавиш, используя свойство mnemonic. Однако вам нужно нажать alt+p, чтобы активировать кнопку. Это действительно наиболее подходит для ярлыков меню. Я хочу активировать кнопку с буквенным нажатием и без alt модификатор.
Я видел этот пост о том, как это сделать, но он кажется абсурдно сложным. Есть ли более простой способ сделать это?
Http://linuxjavaprogrammer.blogspot.com/2008/01/java-swing-jbutton-keyboard-shortcuts.html
Update: после предложения @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
}
});
3 ответов:
Да, Swing был разработан для использованияпривязки ключей . Поэтому вместо того, чтобы добавить actionlistener к кнопку Добавить действие. Затем это действие может быть разделено кнопкой или пунктом меню. Вы также можете назначить любое количество нажатий клавиш для вызова действия с помощью привязки клавиш. В учебнике также есть раздел о действиях, который объясняет, почему использование действия полезно.
JComponent есть registerKeyboardAction(...) метод, который в основном делает привязки InputMap / ActionMap для вас, но он также должен обернуть ActionListener в действие оболочки, так что его предпочтительно для вас, чтобы сделать вы сами привязки.
В дополнение к ответу камикра, я теперь использую небольшую функцию полезности, как это:
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 );
У меня была аналогичная проблема с динамически построенной (основанной на вводе данных) формой, и в итоге я просто прикрепил действие keyListener к кнопкам. При построении формы я разбираю дерево компонентов для кнопок и прикрепляю прослушиватель. Слушатель, чем также анализирует дерево и сопоставляет нажатие клавиши с соответствующей кнопкой (через текст в кнопке), так как я не знаю, какой из них будет иметь фокус в любой момент времени, и запускает кнопку doClick... Это некрасиво, кажется банальным, и должен быть немного интенсивным процессором, но он обеспечивает гибкость, необходимую мне для этой конкретной динамической формы...
Comments