2010-11-21 2 views
9

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

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

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

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 
} 
}); 

ответ

5

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

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

0

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

1

в дополнении к ответу 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); 
Смежные вопросы