2017-02-20 99 views
0

這裏是我的代碼:如何使用KeyAdapter檢測CTRL + SHIFT + ANY_KEY?

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

      } 
     }); 

controlShortcut完美。儘管如此,當我在測試中添加KeyEvent.SHIFT_MASK時,它不起作用。此外,當我這樣做:

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

它不起作用。我不明白爲什麼,因爲我只是添加了相同的測試。

+1

對於這樣的事情,你應該使用[Key Bindings](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)。 – camickr

回答

2

這不是如何按位運算符工作。 KeyEvent.CTRL_MASK & KeyEvent.SHIFT_MASK總是給出0,因爲你在和不同的面具。

你想要做的是使用創建兩個口罩或:

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

這將打印

真正

只有當CTRL + 轉變 + D is p ressed。

如果你寫

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

它會檢查是否CTRL轉變任何(或兩者)按下。

請注意,您應該使用getModifiersEx以及X_DOWN_MASK而不是getModifiers以及X_MASK

+0

我包含此代碼作爲「else if」子句,因此無法正常工作。我現在才發現它。非常感謝您的回答! –

+1

@EricsonWillians好吧,沒有人知道'CheckShortcut'是什麼,所以我們所能做的就是告訴你它是如何完成的,而不是找到並修復代碼中的錯誤。未來,提供[mcve]。別客氣。 – user1803551

+0

其實很簡單。只是一個接口:'接口CheckShortcut {布爾f(int鍵); }'。我必須打印測試結果才能發現它已經恢復正常。出於某種原因,它不能用作簡單'evt.getModifiers()'測試的「else if」子句。 –

0

您在掩碼上使用了錯誤的按位運算符。
JavaDocs

正確的方法應該是:

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

參見下面的方法:

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

有些事情是錯誤的,即使使用替代選項,它們都不起作用:'return(evt.getKeyCode()== key)&& evt.isControlDown()&& evt.isShiftDown();'。 3個鍵同時不被識別。 –

+0

@EricsonWillians有什麼不對 - 這個答案。它檢查控制權或輪班。 – user1803551

+0

@ user1803551請不要評論,如果你不知道你在說什麼。事實上,即使是&&方法沒有工作,這意味着他的邏輯是錯誤的 – stelar7

0

你可以只爲切換鍵和控制創建兩個布爾值。

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