【问题标题】:KeyStroke.getKeyStroke(int, int) modifiers getting overwritten?KeyStroke.getKeyStroke(int, int) 修饰符被覆盖?
【发布时间】:2020-07-20 03:07:33
【问题描述】:

在遇到 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; 
  }      
}

【问题讨论】:

    标签: java awt keystroke


    【解决方案1】:

    getKeyStoredToSystem 方法确实返回了两个掩码(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");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2015-03-06
      • 2021-03-23
      • 2017-04-22
      相关资源
      最近更新 更多