JButtonがクリックされたときにShiftキーなどが押下されているかをテストする
Total: 4433
, Today: 7
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JButton
やJMenuItem
がクリックされたとき、同時にShiftキーなどが押下されているかをテストします。
Screenshot
Advertisement
サンプルコード
JButton button = new JButton("TEST: ActionEvent#getModifiers()");
button.addActionListener(e -> {
// BAD EXAMPLE: boolean isShiftDown = (e.getModifiers() & InputEvent.SHIFT_MASK) != 0;
// Always use ActionEvent.*_MASK instead of InputEvent.*_MASK in ActionListener
boolean isShiftDown = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
if (isShiftDown) {
LOGGER.info("JButton: Shift is Down");
} else {
LOGGER.info("JButton: Shift is Up");
}
if ((e.getModifiers() & AWTEvent.MOUSE_EVENT_MASK) != 0) {
LOGGER.info("JButton: Mouse event mask");
}
});
View in GitHub: Java, Kotlin解説
JButton
+ActionListener
(e.getModifiers() & ActionEvent.SHIFT_MASK) != 0
でShiftキーが押されているかを判断するActionListener
内で(e.getModifiers() & InputEvent.SHIFT_MASK) != 0
とInputEvent.SHIFT_MASK
を使用すべきではない- どちらも定数値は
1
だがInputEvent.SHIFT_MASK
はキーストローク用、またJava 9
からInputEvent.SHIFT_MASK
は非推奨でInputEvent.SHIFT_DOWN_MASK
を使うべき InputEvent.SHIFT_DOWN_MASK
はInputEvent.getModifiersEx()
と合わせて使用するMouseEvent
やKeyEvent
はInputEvent
を継承しているが、ActionEvent
は継承していないのでgetModifiersEx()
メソッドは存在しない- ActionEvent.SHIFT_MASK:
1
- InputEvent.SHIFT_MASK:
1
@Deprecated(since="9")
- InputEvent.SHIFT_DOWN_MASK:
64
- ActionEvent.SHIFT_MASK:
JTextField
+InputMap
、またはKeyListener
、MouseListener
(e.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) != 0
でShiftキーが押されているかを判断するMouseEvent
はInputEvent
を継承しているので、MouseListener
内ではInputEvent#isShiftDown()
なども使用可能
JMenuItem
などがキー入力ではなくマウスでクリックされたかどうかは(ActionEvent#getModifiers() & AWTEvent.MOUSE_EVENT_MASK) != 0
で判断可能
参考リンク
- ActionEvent (Java Platform SE 8)
- java - isShiftDown when JButton pressed? - Stack Overflow
- <AWT Dev> creating an ActionEvent with modifiers from an InputEvent