Сочетание клавиш для jButton без использования клавиши Alt - PullRequest
10 голосов
/ 22 ноября 2010

В SWT вы можете назначить любой кнопке сочетание клавиш, просто добавив & перед буквой в ярлыке кнопки.Например, если моя метка кнопки &Play, я могу активировать кнопку, нажав на клавиатуре букву p.

В Swing вы можете добавить сочетание клавиш, используя свойство mnemonic.Тем не менее, вам нужно нажать alt+p, чтобы активировать кнопку.Это действительно наиболее подходит для ярлыков меню.Я хочу активировать кнопку нажатием буквы и без модификатора alt.

Я видел этот пост о том, как это сделать, но он кажется нелепо сложным.Есть ли более простой способ сделать это?

http://linuxjavaprogrammer.blogspot.com/2008/01/java-swing-jbutton-keyboard-shortcuts.html

Обновление: После предложения @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 ]

5 голосов
/ 22 ноября 2010

Да, Swing был разработан для использования привязок клавиш . Поэтому вместо добавления ActionListener к кнопке вы добавляете Action. Тогда это действие может быть разделено кнопкой или пунктом меню. Вы также можете назначить любое количество комбинаций клавиш для вызова действия с помощью привязок клавиш. В руководстве также есть раздел «Действия», в котором объясняется, почему использование действия является полезным.

JComponent имеет метод registerKeyboardAction (...), который в основном выполняет привязки InputMap / ActionMap для вас, но он также должен обернуть ActionListener в обертку Action, так что вы предпочитаете делать собственные привязки.

1 голос
/ 09 апреля 2015

В дополнение к ответу camickr, я теперь использую небольшую служебную функцию, подобную этой:

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 );
0 голосов
/ 12 июля 2012

У меня была похожая проблема с динамически создаваемой (основанной на вводе данных) формой, и я просто подключил к кнопкам действие keyListener. При построении формы я анализирую дерево компонентов для кнопок и присоединяю слушателя. Слушатель также анализирует дерево и сопоставляет нажатие клавиши с соответствующей кнопкой (через текст на кнопке), поскольку я понятия не имею, какая из них будет фокусироваться в любой момент времени, и запускает кнопку doClick ... кажется хакерским, и он должен быть немного интенсивным процессором, но он обеспечивает гибкость, необходимую мне для этой конкретной динамической формы ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...