这是我的代码:
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);
};
它不起作用。我不明白为什么,因为我只是添加相同的测试。
答案 0 :(得分:3)
这不是按位运算符的工作方式。 KeyEvent.CTRL_MASK & KeyEvent.SHIFT_MASK
总是给0,因为你正在使用不同的面具。
您要做的是使用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);
这将打印
真
仅当按下 ctrl + shift + D 时。
如果你写
(e.getModifiersEx() & down) != 0
它将检查是否按下 或 shift 的任何(或两者)。
请注意,您应该使用getModifiersEx
和X_DOWN_MASK
而不是getModifiers
以及X_MASK
。
答案 1 :(得分:0)
您在掩码上使用了错误的按位运算符 请参阅JavaDocs
正确的方法应该是:
frame.getContentPane().add(listDisplay, BorderLayout.EAST);
另见以下方法:
int mask = CTRL_DOWN_MASK | SHIFT_DOWN_MASK;
if(evt.getModifiersEx() & mask == mask) {doStuff();}
答案 2 :(得分:0)
您可以为shift和control创建两个布尔值。
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;
}
}
}