如何在 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 = 00000001SWT.SHIFT = 00000100

使用第一种方法,对于 100001010001010100000101 这样的掩码,您会得到 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);
    }
}