KeyStroke.getKeyStroke(int, int) 修饰符被覆盖?

KeyStroke.getKeyStroke(int, int) modifiers getting overwritten?

下面的代码“在我看来”就像它应该的那样,在遇到 CTRL 掩码时,将其删除(然后取出),插入(或插入)ALT 掩码,然后进行新的击键ALT 掩码并且没有 CTRL 掩码。事实上,我已经确认“修饰符”设置正确。

然而,当传递一个包含 CTRL 掩码的击键时,我实际上从例程中得到的是一个包含两个掩码(CTRL 和 ALT)的击键。

我以前是直接返回方法结果,当似乎有东西被覆盖时,尝试在“k2”的中间步骤中添加,但这没有帮助。

有什么问题吗?

public KeyStroke getKeyStoredToSystem (KeyStroke k) {
  int modifiers = k.getModifiers();
  if ((modifiers & InputEvent.CTRL_DOWN_MASK) != 0) {
    modifiers &= ~InputEvent.CTRL_DOWN_MASK;
    modifiers |= InputEvent.ALT_DOWN_MASK;
    KeyStroke k2 = KeyStroke.getKeyStroke(k.getKeyCode(), modifiers); 
    return k2; 
  } 
  else {
    return k; 
  }      
}

方法getKeyStoredToSystem确实returns两个掩码(CTRL和ALT)。这是由于未删除的遗留和弃用 Event.CTRL_MASK。这是固定的方法:

public KeyStroke getKeyStoredToSystem(KeyStroke k) {
    int modifiers = k.getModifiers();
    // If modifiers contains CTRL_DOWN_MASK
    if ((modifiers & InputEvent.CTRL_DOWN_MASK) != 0) { 
        // Remove CTRL_DOWN_MASK
        modifiers &= ~InputEvent.CTRL_DOWN_MASK; 
        // Remove deprecated CTRL_MASK
        modifiers &= ~Event.CTRL_MASK;  
        // Add ALT_DOWN_MASK
        modifiers |= InputEvent.ALT_DOWN_MASK;
        return KeyStroke.getKeyStroke(k.getKeyCode(), modifiers);
    } else {
        return k;
    }
}

在测试方法中可以看到结果:

@Test
public void mytest() throws KeyStoreException {
    KeyStroke ks = KeyStroke.getKeyStroke("ctrl pressed Z");
    KeyStroke actual = getKeyStoredToSystem(ks);
    
    Assert.assertEquals(actual.toString(),"alt pressed Z");
}