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

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)