Сочетание клавиш для 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
}
});
480   3  

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

    Ничего не найдено.