zoukankan      html  css  js  c++  java
  • 事件扩展修饰符与位运算

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

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

  • 相关阅读:
    Java根据百度API获得经纬度,然后根据经纬度在获得城市信息
    获取鼠标位置的几个通用的JS函数
    java 定时备份数据库
    基于commons-net实现ftp创建文件夹、上传、下载功能
    java自动识别用户上传的文本文件编码
    CSS3实现10种Loading效果
    Java实现拖拽上传
    JAVA 比较两张图片的相似度的代码
    Java jsp页面中jstl标签详解
    mysql去除重复数据
  • 原文地址:https://www.cnblogs.com/andong2015/p/4301895.html
Copyright © 2011-2022 走看看