Swing/ActionEventModifiers のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ActionEventModifiers へ行く。
- category: swing folder: ActionEventModifiers title: JButtonがクリックされたときにShiftキーなどが押下されているかをテストする tags: [JButton, ActionListener, ActionEvent, InputEvent] author: aterai pubdate: 2018-01-01T18:58:15+09:00 description: JButtonやJMenuItemがクリックされたとき、同時にShiftキーなどが押下されているかをテストします。 image: https://drive.google.com/uc?id=1OqGPANokzyj1ocWyhI1StYYYEm0o0fCAKw
概要
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
で判断する