2017-02-20 98 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; 
     } 
    } 
}