zoukankan      html  css  js  c++  java
  • 后端 Java ActionEvent getModifiers()

    前些日子學弟來問怎麼判斷按下 Button 時,是否有同時按下Ctrl+Alt。學弟是在actionPerformed裡,用 ActionEvent 的getModifiers()ActionEvent.ALT_MASKActionEvent.CTRL_MASK來判斷,不過他執行出來的結果卻是錯的。由於以前也沒有用過 getModifiers(),所以花了點時間研究,再加上這過程還發生怎麼在 Mac 上可以用,但在 Win 上反而不行 的情況,因此在這邊整理了一下學習心得。

    首先是getModifiers()的值,我自己遇到的狀況是根據平台以及使用 AWT 還是 Swing 的 Button 而不同,所以 debug 的時間一直栽在這邊….

    KeyMac, Win(Swing JButton)Win(AWT Button)
    only click, 16 0
    with Ctrl, 16|2=18 0|128=128
    with Alt, 16|8=24 0|512=512
    with Shift, 16|1=17 0|64=64
    with Alt+Ctrl, 16|8|2=26 0|512|128=640

    得到了 Modifiers 的值後,接著就是用 MASK 來比對。如果是上表左邊的情況,使用 ActionEvent 提供的ALT_MASKCTRL_MASK等等即可;但如果是右邊的情況,就變成要使用InputEventALT_DOWN_MASKCTRL_DOWN_MASK等等。使用方法是 Modifiers 值與 mask 值的AND運算結果是否等於 mask 值,就知道 Modifiers 是否有按下該 Modifier。寫成函式就是:

    private boolean checkModifiers(int modifiers, int mask) {
        return((modifiers & mask) == mask);
    }
    

    若要判斷是否有兩個 Modifier key,如Alt+Ctrl,則 mask 就是這兩個 Modifier Mask 值的OR運算。 例如

    int altWithCtrlMask = ActionEvent.ALT_MASK | ActionEvent.CTRL_MASK;
    

    altWithCtrlMask再來跟 getModifiers 的值進行AND運算後是否等於altWithCtrlMask。 再舉個例子,如果是同時按下 Alt+Ctrl+Shift,getModifiers() 會得到 27,而ActionEvent.ALT_MASK | ActionEvent.CTRL_MASK的值為 10,

       27 = 00011011
       10 = 00001010
    27|10 = 00001010
    

    則 27 AND 10 == 10,所以有判斷到 Alt+Ctrl

    https://www.dazhuanlan.com/huangbochn/topics/1005286

  • 相关阅读:
    C#多线程编程实战(一):线程基础
    查找算法之顺序查找
    设计模式01 创建型模式
    查找算法之二分查找
    设计模式01 创建型模式
    每天学一个,设计模式概要
    设计模式 01
    汽车电子传感器科普:激光雷达 毫米波雷达 超声波雷达
    C 如何判断编译器是否支持C90 C99?
    Node.js之EventEmiter
  • 原文地址:https://www.cnblogs.com/yuluoxingkong/p/15104832.html
Copyright © 2011-2022 走看看