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

java SWT:MouseEvent,KeyEvent中stateMask字段的用法相关推荐

  1. Java陷阱:内部类中的字段访问

    这本身不是一个"陷阱",而是一个值得了解的实现细节. 假设我有一个带有字段的内部类. 这样的字段对于封闭的类是可见的,但是以下哪种方法是访问它的最快方法? 注意! 我只在这里查看生 ...

  2. java oracle 换行,oracle中Clob字段中的回车换行在jsp中展示的问题

    在开发过程出现这么一个问题: 比如:一个字段content 类型CLOB,这其中存的有可能复制粘贴过来的word excel html中的内容,用java将这些内容存入,存入后有特殊的符号 比如回车换 ...

  3. java sendmessage函数_vc中SendMessage自定义消息函数用法实例

    本文实例讲述了vc中SendMessage自定义消息函数用法,分享给大家供大家参考.具体如下: SendMessage的基本结构如下: SendMessage( HWND hWnd,  //消息传递的 ...

  4. java swt 双屏_Java中AWT、Swing与SWT三大GUI技术的原理与效率差异

    看了一下对Java GUI讨论的帖子,所以写了一篇文章来阐述一下各种GUI技术的优劣. Java世界中,目前最知名的三大GUI库分别是: 1.AWT(Abstract Window Toolkit)抽 ...

  5. java swt 文件选择,Java SWT文件对话框中的文件多选

    //Java文件对话框实现文件多选主要有三种方式.我在这里举三个例子 //他们分别对应Java的三个GUI可视编程框架,这里推荐大家使用Swing或者SWT的 //1.AWT FileDialog d ...

  6. java final定义_Java中final关键字的用法

    final在Java中并不常用,然而它却为我们提供了诸如在C语言中定义常量的功能,不仅如此,final还可以让你控制你的成员.方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中 ...

  7. java 批注框_java 中一些批注的用法

    J2SE 提供的最后一个批注是 @SuppressWarnings.该批注的作用是给编译器一条指令,告诉它对被批注的代码元素内部的某些警告保持静默. 一点背景:J2SE 5.0 为 Java 语言增加 ...

  8. java spring框架 注解_详解Java的Spring框架中的注解的用法

    1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的类的实现: class UserManagerImpl implements UserManager { private ...

  9. java网络编程Socket中SO_LINGER选项的用法解读

    http://blog.sina.com.cn/s/blog_6b1990eb0101171o.html 1:设置该选项: public void setSoLinger(boolean on, in ...

最新文章

  1. CISCO NAT 经典配置合集
  2. 抽象类的基本概念------abstract
  3. 这是300年后的人类生活!你相信吗?
  4. excel文件打不开怎么办_电脑设备管理器打不开怎么办
  5. .condarc(conda 配置文件)、换国内源
  6. 服务器间数据传输的四种方式
  7. 荔枝服务器维护,手把手为你讲解win10系统自动维护功能管理的问题.
  8. 3.面试(3) --- 编程
  9. mysql条件触发器实例_mysql 触发器实例
  10. web 前端课程体系(1/4)
  11. 信息流短视频时长多目标优化
  12. 产品设计体会(五五)
  13. 手刃豆瓣top250排行榜
  14. Scroll View控制菜单栏的伸缩
  15. 第1-6课:算法设计常用思想之穷举法
  16. “登录”呢?还是“登陆”呢??
  17. [翻译] [LaTeX] 分式和二项式 - Fractions and Binomials
  18. 信息物理系统-Rijndael加密算法的实现
  19. 看漫画学python下载_用 Python 下载漫画
  20. Android 集成百度地图之申请TTS授权最新版

热门文章

  1. python综合实验心得体会_综合实验心得体会
  2. Unbrick wr703n wifi router
  3. NOIP复习篇———贪心
  4. 用JS控制SVG的预设动画
  5. App推广拉新的6大方式,你都玩得转吗?
  6. 深度学习笔记其七:计算机视觉和PYTORCH
  7. 论文翻译阅读——Facial Emotion RecognitionUsing Deep Learning:Review And Insights
  8. idea中Hierarchy出现在页面右侧
  9. 神经网络的图像识别技术,神经网络图像角度分析
  10. uniapp,video视频播放不了,页面显示不完整