如何在 SWT KeyListener 中检测 3 次按键
How to detect 3 key presses in SWT KeyListener
截至目前,我正在使用以下代码来检测两次按键。即,Ctrl+F(或)Shift+1...等等,
CCombo comboBox = this.cellEditor.getViewer().getCCombo();
KeyAdapter keyAdapter = new KeyAdapter()
{
@Override
public void keyPressed(final KeyEvent evt)
{
// KeyPreferenceUtils is used to get the eclipse workbench key preference values.
int keyCode = KeyPreferenceUtils.getKeyValue();
if ((evt.stateMask == SWT.CTRL) || (evt.stateMask == SWT.ALT) || (evt.stateMask == SWT.SHIFT) || (evt.stateMask == SWT.COMMAND))
{
String pressedKey = Action.convertAccelerator(evt.stateMask + evt.keyCode);
int pressedKeyValue = Action.convertAccelerator(pressedKey);
if (pressedKeyValue == keyCode)
{
comboBox.setListVisible(true);
}
}
else if (evt.keyCode == keyCode)
{
comboBox.setListVisible(true);
}
}
};
comboBox.addKeyListener(keyAdapter);
现在我的问题是我想检测 3 个按键。即,Ctrl+Shift+2 或一些组合键。
我不太了解 SWT,但我假设 evt.stateMask
是一个 int
用于表示位字段,而 SWT.XXX
值表示相应位的掩码.因此,您可以尝试 if (evt.stateMask & SWT.CTRL > 0 && evt.stateMask & SWT.SHIFT > 0)
。
澄清 evt.stateMask & SWT.CTRL > 0
意味着如果 SWT.CTRL
定义的位设置在 stateMask
中,您将获得大于 0 的值,否则您将获得 0。但是,如果其他位也已设置,您将无法使用该方法检测到它。
如果您只想允许设置这些位,您可以尝试 if (evt.stateMask == (SWT.CTRL | SWT.SHIFT) )
(即您将两个掩码组合起来然后进行比较)。
示例:
为简单起见,我们将使用 8 位值并假设 SWT.CTRL = 00000001
和 SWT.SHIFT = 00000100
。
使用第一种方法,对于 10000101
、00010101
、00000101
这样的掩码,您会得到 true,而对于 00100100
等掩码,您会得到 false。
使用第二种方法,您只会在 stateMask = 00000101
.
时得到正确结果
你想要的或者掩码
@Override
public void keyPressed(final KeyEvent evt)
{
// KeyPreferenceUtils is used to get the eclipse workbench key preference values.
int keyCode = KeyPreferenceUtils.getKeyValue();
if ((evt.stateMask & (SWT.CTRL | SWT.ALT)) == (SWT.CTRL | SWT.ALT)){
// both ctrl and alt are pressed so do something
}
else if ((evt.stateMask == SWT.CTRL) || (evt.stateMask == SWT.ALT) || (evt.stateMask == SWT.SHIFT) || (evt.stateMask == SWT.COMMAND))
{
// do something else
}
else if (evt.keyCode == keyCode)
{
comboBox.setListVisible(true);
}
}
截至目前,我正在使用以下代码来检测两次按键。即,Ctrl+F(或)Shift+1...等等,
CCombo comboBox = this.cellEditor.getViewer().getCCombo();
KeyAdapter keyAdapter = new KeyAdapter()
{
@Override
public void keyPressed(final KeyEvent evt)
{
// KeyPreferenceUtils is used to get the eclipse workbench key preference values.
int keyCode = KeyPreferenceUtils.getKeyValue();
if ((evt.stateMask == SWT.CTRL) || (evt.stateMask == SWT.ALT) || (evt.stateMask == SWT.SHIFT) || (evt.stateMask == SWT.COMMAND))
{
String pressedKey = Action.convertAccelerator(evt.stateMask + evt.keyCode);
int pressedKeyValue = Action.convertAccelerator(pressedKey);
if (pressedKeyValue == keyCode)
{
comboBox.setListVisible(true);
}
}
else if (evt.keyCode == keyCode)
{
comboBox.setListVisible(true);
}
}
};
comboBox.addKeyListener(keyAdapter);
现在我的问题是我想检测 3 个按键。即,Ctrl+Shift+2 或一些组合键。
我不太了解 SWT,但我假设 evt.stateMask
是一个 int
用于表示位字段,而 SWT.XXX
值表示相应位的掩码.因此,您可以尝试 if (evt.stateMask & SWT.CTRL > 0 && evt.stateMask & SWT.SHIFT > 0)
。
澄清 evt.stateMask & SWT.CTRL > 0
意味着如果 SWT.CTRL
定义的位设置在 stateMask
中,您将获得大于 0 的值,否则您将获得 0。但是,如果其他位也已设置,您将无法使用该方法检测到它。
如果您只想允许设置这些位,您可以尝试 if (evt.stateMask == (SWT.CTRL | SWT.SHIFT) )
(即您将两个掩码组合起来然后进行比较)。
示例:
为简单起见,我们将使用 8 位值并假设 SWT.CTRL = 00000001
和 SWT.SHIFT = 00000100
。
使用第一种方法,对于 10000101
、00010101
、00000101
这样的掩码,您会得到 true,而对于 00100100
等掩码,您会得到 false。
使用第二种方法,您只会在 stateMask = 00000101
.
你想要的或者掩码
@Override
public void keyPressed(final KeyEvent evt)
{
// KeyPreferenceUtils is used to get the eclipse workbench key preference values.
int keyCode = KeyPreferenceUtils.getKeyValue();
if ((evt.stateMask & (SWT.CTRL | SWT.ALT)) == (SWT.CTRL | SWT.ALT)){
// both ctrl and alt are pressed so do something
}
else if ((evt.stateMask == SWT.CTRL) || (evt.stateMask == SWT.ALT) || (evt.stateMask == SWT.SHIFT) || (evt.stateMask == SWT.COMMAND))
{
// do something else
}
else if (evt.keyCode == keyCode)
{
comboBox.setListVisible(true);
}
}