专栏首页10km的专栏java SWT:MouseEvent,KeyEvent中stateMask字段的用法

java SWT:MouseEvent,KeyEvent中stateMask字段的用法

版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/53453611

SWT中与键盘鼠标等输入设备有关的事件(MouseEvent,KeyEvent,SelectionEvent GestureEvent TouchEvent)都有一个stateMask字段。 这个字段的作用是以二进制掩码(mask)的方式指示当前键盘的修饰符键(modifier keys)和鼠标按钮(button)的按下状态,

这里modifier keys是指alt,ctrl,shift,command键 鼠标Button则根据鼠标类型不同,可能有左键,中键,右键,BUTTON4,BUTTON5 参见 org.eclipse.swt.SWT 中的常量定义

通过stateMask字段可以判断当前这些辅助键的状态,示例如下。

e.stateMask == SWT.SHIFT // 判断只有shift键按下
(e.stateMask & SWT.MODIFIER_MASK)==SWT.SHIFT // 判断modifier keys中只有shift键按下,忽略mouse button状态
(e.stateMask & SWT.BUTTON_MASK)==SWT.BUTTON1// 判断只有鼠标左键按下,忽略modifier keys状态
e.stateMask ==(SWT.CTRL|SWT.BUTTON1) // 判断只有ctrl和鼠标左键同时按下
(e.stateMask | (SWT.CTRL|SWT.BUTTON1))==(SWT.SHIFT|SWT.BUTTON1) // 判断只有ctrl和鼠标左键同时按下,忽略其他键

上面代码中SWT.MODIFIER_MASK是所有modifier keys的组合掩码 同理SWT.BUTTON_MASK是所有鼠标按钮的组合掩码 这两个常量都在org.eclipse.swt.SWT类的静态初始化代码中被赋值 BUTTON_MASK = BUTTON1 | BUTTON2 | BUTTON3 | BUTTON4 | BUTTON5; MODIFIER_MASK = ALT | SHIFT | CTRL | COMMAND;

需要注意的是,有些特定的事件中,statMask对应的状态是检测不到的: 比如按下shift+鼠标左健,在org.eclipse.swt.events.MouseAdapter中的mouseDown方法中, e.stateMask==(SWT.BUTTON1|SWT.SHIFT)返回是false e.button==1&&e.stateMask==SWT.SHIFT返回才是true, 因为mouseDown事件刚正发生,所以stateMask中SWT.BUTTON1对应的状态位还没有设置为1

但是按下shift+鼠标左健移动鼠标时,在org.eclipse.swt.events.MouseMoveListener中 e.stateMask==(SWT.BUTTON1|SWT.SHIFT)则可以正确判断为true,因为mouseDown已经发生, 而且不能用e.button==1&&e.stateMask==SWT.SHIFT判断,因为e.button只是代表当前事件中按下的鼠标键.

同理shift+鼠标左健后,释放鼠标左键,在org.eclipse.swt.events.MouseAdapter中的mouseUp方法中 e.stateMask和e.button的状态是e.button==1&&e.stateMask==(SWT.BUTTON1|SWT.SHIFT)

可以这样理解: stateMask是已经发生的状态, button中的数字代表当前事件产生的鼠标按键。

为简化代码,将常用的判断写成了静态方法如下: StateMaskUtilits.java

package net.gdface.ui;

import org.eclipse.swt.SWT;

/**
 * @author guyadong
 * @see {@link org.eclipse.swt.events.MouseEvent#stateMask}
 * @see {@link org.eclipse.swt.events.KeyEvent#stateMask}
 * @see {@link org.eclipse.swt.events.SelectionEvent#stateMask}
 * @see {@link org.eclipse.swt.events.GestureEvent#stateMask}
 * @see {@link org.eclipse.swt.events.TouchEvent#stateMask}
 * @see {@link org.eclipse.swt.SWT#BUTTON_MASK}
 * @see {@link org.eclipse.swt.SWT#MODIFIER_MASK}
 */
public class StateMaskUtilits {

    /**
     * 
     * @param stateMask
     * @return modifier keys中有且只有shift键按下则返回true,忽略mouse button状态
     */
    public static final boolean onShift(int stateMask){
        return (stateMask & SWT.MODIFIER_MASK)==SWT.SHIFT;
    }
    /**
     * @param stateMask
     * @return modifier keys中有且只有ctrl键按下则返回true,忽略mouse button状态
     */
    public static final boolean onCtrl(int stateMask){
        return (stateMask & SWT.MODIFIER_MASK)==SWT.CTRL;
    }
    /**
     * @param stateMask
     * @return modifier keys中有且只有alt键按下则返回true,忽略mouse button状态
     */
    public static final boolean onAlt(int stateMask){
        return (stateMask & SWT.MODIFIER_MASK)==SWT.ALT;
    }
    /**
     * @param stateMask
     * @return modifier keys中有且只有command键按下则返回true,忽略mouse button状态
     */
    public static final boolean onCommand(int stateMask){
        return (stateMask & SWT.MODIFIER_MASK)==SWT.COMMAND;
    }
    /**
     * @param stateMask
     * @return 所有modifier keys都没有按下返回true
     */
    public static final boolean zeroModifier(int stateMask){
        return (stateMask & SWT.MODIFIER_MASK) == 0;
    }
    /**
     * @param stateMask
     * @return 所有鼠标按钮都没有按下返回true
     */
    public static final boolean zeroButton(int stateMask){
        return (stateMask & SWT.BUTTON_MASK) == 0;
    }
    /**
     * @param stateMask
     * @return 所有鼠标按钮只有左键按下时返回true
     */
    public static final boolean onButtonLeft(int stateMask){
        return (stateMask & SWT.BUTTON_MASK) == SWT.BUTTON1;
    }
    /**
     * @param stateMask
     * @return 所有鼠标按钮只有中键按下时返回true
     */
    public static final boolean onButtonMiddle(int stateMask){
        return (stateMask & SWT.BUTTON_MASK) == SWT.BUTTON2;
    }
    /**
     * @param stateMask
     * @return 所有鼠标按钮只有右键按下时返回true
     */
    public static final boolean onButtonRight(int stateMask){
        return (stateMask & SWT.BUTTON_MASK) == SWT.BUTTON3;
    }
    /**
     * @param stateMask
     * @param mask
     * @return 指定的组合键(mask)被按下时返回true,忽略其他键
     */
    public static final boolean onMask(int stateMask,int mask){
        return (stateMask & mask) == mask;
    }
    /**
     * @param stateMask
     * @param mask
     * @return 指定的组合键(mask)都没有按下时返回true,忽略其他键
     */
    public static final boolean zeroMask(int stateMask,int mask){
        return (stateMask & mask) == 0;
    }
}

参考 ‘《SWT常用组件》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java SWT:用SWTKeySupport方便进行组合键判断(如Ctrl+F11)

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • java:java.util.Map和java.util.Set的Key类型转换

    google的guava项目提对Map供了丰富强大的转换功能(参见guava jar包中的com.google.common.collect.Maps ) ...

    用户1148648
  • maven:sql-maven-plugin插件执行sql脚本

    sql-maven-plugin插件提供了sql脚本的执行功能,允许用户执行指定的sql脚本文件或语句。 最近在进行一个项目是基于maven管理的java开发项...

    用户1148648
  • 干货 | 携程软件SBC实践

    作者简介 韩海龙,携程通信技术中心工程师,负责VoIP,软交换相关领域技术研究与开发,及携程呼叫中心语音中继接入工作。 一、SBC简介 随着互联网及RTC通信技...

    携程技术
  • linux下sublime如何使用中文

    原来在使用linux的时候最大的诟病是在sublime text下面不能写中文,各种百度和搜索都没能解决,但现在又重新下linux下面做开发,又要重新面对这个问...

    付威
  • 零基础学编程009:只显示2位小数

    我们仍要继续解决这个问题:如何用Python打印这篇枯燥的《复利数据表》? (1+0.01) ^ 1 = 1.01 (1+0.01) ^ 2 = 1.02 (...

    申龙斌
  • 撸一个 JSON 解析器

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。采用...

    芋道源码
  • MySQL 查询一个表的大小

    SELECT @mb := round((sum(DATA_LENGTH) + sum(INDEX_LENGTH)) / (1024 * 1024), 2),...

    一个会写诗的程序员
  • 实现一个JSON解析器,有那么难吗?

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。采用...

    Java团长
  • 实现一个JSON解析器,有那么难吗?

    JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。采用...

    黄泽杰

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动