前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java SWT:MouseEvent,KeyEvent中stateMask字段的用法

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

作者头像
10km
发布2019-05-25 21:34:47
8690
发布2019-05-25 21:34:47
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433532

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常用组件》

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年12月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档