前些日子學弟來問怎麼判斷按下 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

posted on 2021-08-05 18:45  yuluoxingkong  阅读(49)  评论(0编辑  收藏  举报