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