2017-02-20 10 views
0

Hier ist mein Code:Wie kann ich STRG + UMSCHALT + ANY_KEY mit einem KeyAdapter erkennen?

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

      } 
     }); 

Die controlShortcut funktioniert perfekt. Wenn ich jedoch KeyEvent.SHIFT_MASK zum Test hinzufüge, funktioniert es nicht. Auch wenn ich dies tue:

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

Es funktioniert nicht so gut. Ich verstehe nicht warum, da ich gerade den gleichen Test hinzufüge.

+1

Sie sollten [Key Bindings] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) für so etwas verwenden. – camickr

Antwort

2

Dies ist nicht, wie bitweise Operatoren arbeiten. KeyEvent.CTRL_MASK & KeyEvent.SHIFT_MASK gibt immer 0, weil Sie verschiedene Masken AND-in sind.

Was wollen Sie tun, ist eine Maske für beide erstellen mit OR:

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

Dies wird

wahr

nur drucken, wenn ctrl + Verschiebung + D ist p resessed.

Wenn Sie schreiben

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

es prüft, ob jede (oder beide) von ctrl oder Verschiebung gedrückt werden.

Beachten Sie, dass Sie getModifiersEx zusammen mit X_DOWN_MASK und nicht getModifiers zusammen mit X_MASK verwenden sollten.

+0

Ich habe diesen Code als "else if" -Klausel eingefügt, und es funktionierte nicht deswegen. Ich habe es erst jetzt entdeckt. Ich danke Ihnen sehr für Ihre Antwort! –

+1

@EricsonWillians Nun, niemand weiß, was 'CheckShortcut' ist, also können wir Ihnen nur zeigen, wie es gemacht wird und nicht finden und den Fehler in Ihrem Code beheben. Stellen Sie in Zukunft ein [mcve] zur Verfügung. Bitte. – user1803551

+0

Es ist eigentlich ganz einfach. Nur eine Schnittstelle: 'Schnittstelle CheckShortcut {Boolean f (int key); } '. Ich musste das Ergebnis des Tests ausdrucken, um festzustellen, dass es wahr war. Aus irgendeinem Grund funktioniert es nicht als "else if" -Klausel des einfachen 'evt.getModifiers()' -Tests. –

0

Sie verwenden den falschen bitweisen Operator auf den Masken.
Siehe JavaDocs

Der richtige Weg sein sollte:

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

die folgenden Methoden Siehe auch:

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

Etwas stimmt nicht, keiner von ihnen funktioniert, selbst mit der alternativen Option: 'return (evt.getKeyCode() == Schlüssel) && evt.isControlDown() && evt.isShiftDown();'. 3 Tasten gleichzeitig werden nicht erkannt. –

+0

@EricsonWillians Etwas stimmt nicht - diese Antwort. es prüft auf Kontrolle oder Verschiebung. – user1803551

+0

@ user1803551 Bitte kommentieren Sie nicht, wenn Sie nicht wissen, worüber Sie sprechen. Aus der Tatsache, dass selbst das && von Methoden nicht funktioniert, bedeutet es, dass seine Logik falsch ist. – stelar7

0

Sie nur zwei Boolesche Werte für Schicht- und Kontrolle schaffen könnte.

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; 
     } 
    } 
} 
Verwandte Themen