2017-02-20 3 views
0

Voici mon code:Comment puis-je détecter CTRL + MAJ + ANY_KEY en utilisant un KeyAdapter?

 tabbedPane.addKeyListener(new java.awt.event.KeyAdapter() { 
      public void keyPressed(java.awt.event.KeyEvent evt) { 

       CheckShortcut controlShortcut = (key) -> { 
        return (evt.getKeyCode() == key) && ((evt.getModifiers() & KeyEvent.CTRL_MASK) != 0); 
       }; 

       CheckShortcut controlShiftShortcut = (key) -> { 
        return (evt.getKeyCode() == key) && ((evt.getModifiers() & KeyEvent.CTRL_MASK & KeyEvent.SHIFT_MASK) != 0); 
       }; // Does not work <<<<< 

       if (controlShortcut.f(KeyEvent.VK_N)) { 
        createNewFile(); 
       } else if (controlShortcut.f(KeyEvent.VK_O)) { 
        openFile(); 
       } else if (controlShortcut.f(KeyEvent.VK_S)) { 
        save(); 
       } else if (controlShiftShortcut.f(KeyEvent.VK_S)) { 
        saveAs(); 
       } else if (controlShortcut.f(KeyEvent.VK_Q)) { 
        System.exit(0); 
       } else if (controlShortcut.f(KeyEvent.VK_W)) { 
        MainFrame.toggleFrame(qrWebcamFrame); 
       } else if (controlShortcut.f(KeyEvent.VK_C)) { 
        MainFrame.toggleFrame(comandaCreationFrame); 
       } else if (controlShortcut.f(KeyEvent.VK_P)) { 
        if (accessPasswordFrame("Senha de administrador", 
          "Login: ", "Senha de administrador inválida.", 
          ADMIN_TYPE)) { 
         MainFrame.toggleFrame(passwordFrame); 
        } 
       } 

      } 
     }); 

Les controlShortcut fonctionne parfaitement. Néanmoins, lorsque j'ajoute KeyEvent.SHIFT_MASK au test, cela ne fonctionne pas. Aussi, quand je fais ceci:

 CheckShortcut controlShiftShortcut = (key) -> { 
      return (evt.getKeyCode() == key) && ((evt.getModifiers() & KeyEvent.CTRL_MASK) != 0) && ((evt.getModifiers() & KeyEvent.SHIFT_MASK) != 0); 
     }; 

Cela ne fonctionne pas aussi bien. Je ne comprends pas pourquoi, puisque j'ajoute juste le même test.

+1

Vous devriez utiliser [Key Bindings] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) pour quelque chose comme ceci. – camickr

Répondre

2

Ce n'est pas ainsi que les opérateurs de bits fonctionnent. KeyEvent.CTRL_MASK & KeyEvent.SHIFT_MASK donne toujours 0 parce que vous êtes AND-ing différents masques.

Ce que vous voulez faire est de créer un masque à la fois en utilisant OU:

int down = KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK; 
if ((e.getModifiersEx() & down) == down && (e.getKeyCode() == KeyEvent.VK_D)) 
    System.out.println(true); 

Ce imprimera

vrai

que lorsque ctrl + changement + D est p ressassé.

Si vous écrivez

(e.getModifiersEx() & down) != 0 

il vérifiera si une (ou les deux) de ctrl ou changement sont pressés. Notez que vous devez utiliser getModifiersEx avec X_DOWN_MASK et non getModifiers avec X_MASK.

+0

J'ai inclus ce code comme une clause "else if", et cela ne fonctionnait pas à cause de cela. Je l'ai découvert seulement maintenant. Merci beaucoup pour votre réponse! –

+1

@EricsonWillians Eh bien, personne ne sait ce que 'CheckShortcut' est, donc tout ce que nous pourrions faire est de vous montrer comment c'est fait et ne pas trouver le et corriger l'erreur dans votre code. À l'avenir, fournissez un [mcve]. Vous êtes les bienvenus. – user1803551

+0

C'est assez simple, en fait. Juste une interface: 'interface CheckShortcut {Boolean f (int key); } '. J'ai dû imprimer le résultat du test pour découvrir qu'il revenait vrai. Pour une raison quelconque, cela ne fonctionne pas comme une clause "else if" du test simple 'evt.getModifiers()'. –

0

Vous utilisez le mauvais opérateur bitwise sur les masques.
Voir la JavaDocs

La manière correcte devrait être:

int mask = CTRL_DOWN_MASK | SHIFT_DOWN_MASK; 
if(evt.getModifiersEx() & mask == mask) {doStuff();} 

Voir aussi les méthodes suivantes:

evt.isControlDown(); 
evt.isAltDown(); 
evt.isShiftDown(); 
+0

Quelque chose ne va pas, aucun d'eux ne fonctionne, même avec l'option alternative: 'return (evt.getKeyCode() == key) && evt.isControlDown() && evt.isShiftDown();'. 3 touches en même temps ne sont pas reconnues. –

+0

@ EricsonWillians Quelque chose ne va pas - cette réponse. il vérifie pour le contrôle ou le décalage. – user1803551

+0

@ user1803551 s'il vous plaît ne commentez pas si vous ne savez pas de quoi vous parlez. Du fait que même les méthodes de && n'ont pas fonctionné, cela signifie que sa logique est fausse – stelar7

0

Vous pouvez simplement créer deux valeurs booléennes pour le décalage et le contrôle.

public class DummyClass implements KeyListener{ 
    boolean shift = false, control = false; 

    public void KeyPressed(KeyEvent e) 
    { 
     if(e.getKeyCode() == KeyEvent.VK_SHIFT) 
     { 
      shift = true; 
     }   
     if(e.getKeyCode() == KeyEvent.VK_CONTROL) 
     { 
      control = true; 
     } 
     if(shift && control) 
     { 
      //Do something 
     } 
     else if(shift) 
     { 
      //Do something 
     } 
     else if(control) 
     { 
      //Do something 
     } 
    } 
    public void KeyReleased(KeyEvent e) 
    { 
     if(e.getKeyCode() == KeyEvent.VK_SHIFT) 
     { 
      shift = false; 
     }   
     if(e.getKeyCode() == KeyEvent.VK_CONTROL) 
     { 
      control = false; 
     } 
    } 
}