今天查看别人重写的鼠标拖动事件的源码时,有一段代码很不解
1 public void mouseDragged(MouseEvent e) { 2 form.setCursor(mc); 3 if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0) 4 form.setLocation(e.getXOnScreen() - this.x, e.getYOnScreen() 5 - this.y); 6 }
这里(e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0 究竟是什么意思呢?在判断什么呢?
经过查询资料后,发现e.getModifiersEx()方法返回此事件的扩展修饰符掩码。扩展修饰符表示所有模式键的状态,例如 ALT、CTRL、META 和事件发生后那一刻的鼠标按钮。
先将下面的例子,这是api上给的示例:
建议不使用 ==
来比较此方法的返回值,因为在以后会增加新的修饰符。例如,检查 SHIFT 和 BUTTON1 已经按下而 CTRL 未按下的正确方法可以通过以下代码来演示:
int onmask = SHIFT_DOWN_MASK | BUTTON1_DOWN_MASK; int offmask = CTRL_DOWN_MASK; if (event.getModifiersEx() & (onmask | offmask) == onmask) { ... }
即使添加了新的修饰符,上述代码仍然有效。
查看java源码中这些修饰符的定义,其实是将1进行位运算得出的,相当于标示位:
public static final int BUTTON1_DOWN_MASK = 1 << 10; //也就是 10000000000(二进制)
public static final int SHIFT_DOWN_MASK = 1 << 6; //也就是1000000
那么
SHIFT_DOWN_MASK | BUTTON1_DOWN_MASK=10001000000,那么也就是说,如果SHIFT 和 BUTTON1 已经按下返回的值应该是10001000000,所以应该和SHIFT_DOWN_MASK | BUTTON1_DOWN_MASK相等。
返回来看上面的问题,这是鼠标拖动事件重写,也就是鼠标左键要按下,而其他键不管,也就是修饰符的二进制码的从右往左的第7位必须是“1”(因为SHIFT_DOWN_MASK = 1 << 6; //也就是1000000),而 & 的规则是“两边都是真才是真(0是假,1是真)”,所以如果修饰符的第七位是1的话,最后的结果必不为0,而是1000000。
由此可见,java通过二进制位上的数字来记录不同的状态,(e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0 目的就是检查鼠标左键是否按下