为何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不一致。
验证与修复方案
使用旧版
_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()); // 数值将完全匹配使用
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
相关产品推荐
相关产品推荐

