Java ActionEvent getModifiers()
前些日子學弟來問怎麼判斷按下Button時,是否有同時按下Ctrl+Alt。學弟是在actionPerformed裡,用ActionEvent的getModifiers()與ActionEvent.ALT_MASK和ActionEvent.CTRL_MASK來判斷,不過他執行出來的結果卻是錯的。由於以前也沒有用過getModifiers(),所以花了點時間研究,再加上這過程還發生怎麼在Mac上可以用,但在Win上反而不行的情況,因此在這邊整理了一下學習心得。
首先是getModifiers()的值,我自己遇到的狀況是根據平台以及使用AWT還是Swing的Button而不同,所以debug的時間一直栽在這邊....
得到了Modifiers的值後,接著就是用MASK來比對。如果是上表左邊的情況,使用ActionEvent提供的ALT_MASK和CTRL_MASK等等即可;但如果是右邊的情況,就變成要使用InputEvent的ALT_DOWN_MASK和CTRL_DOWN_MASK等等。使用方法是Modifiers值與mask值的AND運算結果是否等於mask值,就知道Modifiers是否有按下該Modifier。寫成函式就是:
如何是要判斷是否有兩個Modifier key,例如是Alt+Ctrl,則mask就是這兩個Modifier Mask值的OR運算。 例如
再舉個例子,如果是同時按下Alt+Ctrl+Shift,getModifiers()會得到27,而
ActionEvent.ALT_MASK | ActionEvent.CTRL_MASK的值為10,
首先是getModifiers()的值,我自己遇到的狀況是根據平台以及使用AWT還是Swing的Button而不同,所以debug的時間一直栽在這邊....
Key | Mac, 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_MASK和CTRL_MASK等等即可;但如果是右邊的情況,就變成要使用InputEvent的ALT_DOWN_MASK和CTRL_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。
留言
張貼留言