2013-04-17 4 views
0

Я собираюсь использовать keybinding в приложении swing для ввода num pad, но ключ трудно поймать. Все примеры, которые я видел полагаться на что-то вроде
key == KeyEvent.VK_KP_LEFTКак определить keyStroke для numpad - введите ключ

где VK_KP_LEFT есть некоторое заданное значение. Другие варианты, чтобы определить, как это keystoke:
KeyStroke.getKeyStroke("control A");
KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);

, но я не нашел «модификатор» для NumPad.

Что легко получить разница между общим и NumPad введите: Все Numpad-клавиши (независимо обозначают, если переключился в цифровом режиме или нет) получить назначен
getKeyLocation() == 4
(I spottetd это из ключевые прессованные/ключ выпустил методы)

вопрос в том:
Как правильно подготовить KeyStroke для цифровой клавиатуры клавиши ввода, чтобы использовать его в ключе привязки метода
inputMap.put(KeyStroke keyStroke, Object actionMapKey)
?

Спасибо,
Тарик

ответ

2

Если вы ищете для связывания Введите ключ можно использовать KeyEvent.VK_ENTER, то есть:

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "someAction"); 
getActionMap().put("someAction", someAction); 

Вот краткий пример:

import java.awt.event.*; 
import javax.swing.*; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Hit Enter")); 

     Action someAction = new AbstractAction() { 
      public void actionPerformed(ActionEvent e) { 
       JOptionPane.showMessageDialog(frame, "Got it"); 
      } 
     }; 

     panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
       KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "someAction"); 
     panel.getActionMap().put("someAction", someAction); 

     frame.add(panel); 

     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

EDIT: VK_ENTER на цифровой клавиатуре и основной клавиатуре

После некоторых испытаний, похоже, что эти ключи могут быть недоступны отдельно. То же самое KeyStroke генерируется для обоих ключей. Реализация JComponent.processKeyBinding не изучает KeyEvent, все, что ей нужно, это KeyStroke, чтобы найти требуемое действие.

SwingUtilities.notifyAction, ответственный за отправку фактического действия, не делегирует все детали KeyEvent (только ключ, модификаторы и когда). Таким образом, внутри действия невозможно отличить ни то, ни другое в ActionEvent.

Если это стоит того, вы можете переопределить processKeyBinding и добавить логику при необходимости. Вы также можете использовать KeyboardFocusManageraddKeyEventDispatcher() для блокировки одного из ключей.

+2

Хотя технически правильно, в том, что он должен ответить на оба входа ключи, я считаю, что ОП хочет ограничить Акция только на клавиатуре клавишу ввода – MadProgrammer

+0

@MadProgrammer Правда, я, возможно, неправильно вопрос. Возможно, невозможно различать эти два ключа. Интересно, может ли ОП предоставить более подробную информацию. – tenorsax

-1

Как насчет этого?

if(keyEvent.getKeyLocation() == KeyEvent.KEY_LOCATION_NUMPAD 
&& keyEvent.getKeyCode() == KeyEvent.VK_ENTER) 
+5

С уважением, это не вопрос о Key Listeners, о привязке клавиш, его невозможно будет определить местоположение KeyEvent, когда ключ активирован. – MadProgrammer

+1

Спасибо за вашу помощь. Кажется, трудно точно привязать только к numpad_enter. На данный момент я не уверен, стоит ли искать дорогостоящие решения или изменить дизайн для слушателя. В конце код должен соответствовать требованиям и не должен выглядеть сложнее, чем нужно :-). Cheers, Tarik – tarik

+0

Хорошо, я мог бы помочь :) –

Смежные вопросы