You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何KeyStroke设置的modifiers与getModifiers返回值不一致?

问题原因与解决方法

核心原因

你遇到的数值差异,是Swing的KeyStroke对两类修饰符常量的处理逻辑不同导致的:

  • 你传入的m使用的是新版_DOWN_MASK系列常量(如SHIFT_DOWN_MASK、CTRL_DOWN_MASK、ALT_DOWN_MASK),这类属于InputEvent定义的扩展掩码,用于精准标识输入事件状态。
  • 而KeyStroke.getModifiers()方法返回的是旧版_MASK系列常量组合(如SHIFT_MASK、CTRL_MASK、ALT_MASK)——这是Swing早期的修饰符定义,KeyStroke内部会自动将传入的_DOWN_MASK掩码转换为对应的_MASK掩码,同时保留原_DOWN_MASK位,最终返回的数值是两类掩码的叠加,因此和你传入的m不一致。

验证与修复方案

  1. 使用旧版_MASK常量创建KeyStroke:
    如果你希望getModifiers()返回值和传入的m一致,直接用旧版常量初始化m:

    int m = KeyEvent.SHIFT_MASK | KeyEvent.CTRL_MASK | KeyEvent.ALT_MASK;
    KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, m);
    System.out.println(m + " " + ks.getModifiers()); // 数值将完全匹配
    
  2. 使用getModifiersEx()替代getModifiers():
    若必须使用_DOWN_MASK系列常量,调用getModifiersEx()方法获取新版掩码,它会直接返回你传入的_DOWN_MASK组合值:

    int m = KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK | KeyEvent.ALT_DOWN_MASK;
    KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, m);
    System.out.println(m + " " + ks.getModifiersEx()); // 输出将完全匹配
    

getModifiers()是为兼容旧代码保留的方法,而getModifiersEx()才是获取新版_DOWN_MASK掩码的正确接口。

内容的提问来源于stack exchange,提问作者Akkaunt 145

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:33:20