事件扩展修饰符与位运算

今天查看别人重写的鼠标拖动事件的源码时,有一段代码很不解

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 目的就是检查鼠标左键是否按下

原文地址:https://www.cnblogs.com/andong2015/p/4301895.html