如何检测SWT KeyListener中的3个按键

时间:2016-08-01 08:14:40

标签: java eclipse swt rcp

截至目前,我正在使用以下代码来检测两个按键。即,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或某些组合键。

2 个答案:

答案 0 :(得分:2)

你想要的还是面具代码

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

答案 1 :(得分:1)

我不太了解SWT,但我认为evt.stateMaskint用于表示位字段,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这样的掩码,对00100100等掩码使用false。

使用第二种方法,您只能获得stateMask = 00000101