2010-06-16 11 views
6

Je dois déterminer l'état actuel de la touche Maj, mais au moment où j'ai besoin de l'état, je n'ai pas d'objet InputEvent autour. J'ai besoin de quelque chose comme java.awt.Toolkit.getLockingKeyState(int) qui fonctionne pour Shift, pas seulement les clés de verrouillage comme VK_CAPS_LOCK. Est-il possible de le faire sans écouter les événements d'entrée et de stocker le pour plus tard quand j'ai besoin de vérifier l'état?Déterminer l'état de la clé de modification sans un objet InputEvent dans Java

Merci!

+1

Bonne question. L'implémentation avec laquelle je travaille utilise un InputEvent/KeyListener mais cela signifie que nous avons un hack pour déterminer si le shift est en panne ou non, cela ne fonctionne pas si vous avez une autre application focalisée, pressez shift, puis passez à la fenêtre de l'application. –

Répondre

1

Je ne pense pas qu'il soit possible d'obtenir le statut de la touche Shift si vous n'avez pas d'événement en main. Même java.awt.Toolkit.getLockingKeyState (int) utilise du code natif pour obtenir ses informations. Je suis sûr que vous pourriez concevoir votre propre traqueur d'événement/magasin, etc., mais juste au cas où, voici une petite méthode qui pourrait être utile. Vous devez lui fournir un composant AWT qui a le focus.

public static boolean isShiftDown(Component c) throws AWTException { 
    final List<Boolean> res = new ArrayList<Boolean>(); 
    final KeyListener listener = new KeyAdapter() { 
     @Override public void keyReleased(KeyEvent e) { 
      res.add(e.isShiftDown()); 
     } 
    }; 
    c.addKeyListener(listener); 
    new Robot().keyRelease(KeyEvent.VK_ALT); 
    try {Thread.sleep(50);} catch (InterruptedException e) {} 
    c.removeKeyListener(listener); 
    if (res.size() > 0) 
     return res.get(0); 
    throw new AWTException("Could not get shift key status."); 
}