---
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
---
* 概要 [#summary]
`JButton`や`JMenuItem`がクリックされたとき、同時にKBD{Shift}キーなどが押下されているかをテストします。

#download(https://drive.google.com/uc?id=1OqGPANokzyj1ocWyhI1StYYYEm0o0fCAKw)

* サンプルコード [#sourcecode]
#code(link){{
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");
  }
});
}}

* 解説 [#explanation]
- `JButton` + `ActionListener`
-- `(e.getModifiers() & ActionEvent.SHIFT_MASK) != 0`でKBD{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()`メソッドは存在しない
--- [https://docs.oracle.com/javase/jp/9/docs/api/constant-values.html#java.awt.event.ActionEvent.SHIFT_MASK ActionEvent.SHIFT_MASK]: `1`
--- [https://docs.oracle.com/javase/jp/9/docs/api/constant-values.html#java.awt.event.InputEvent.SHIFT_MASK InputEvent.SHIFT_MASK]: `1` `@Deprecated(since="9")` 
--- [https://docs.oracle.com/javase/jp/9/docs/api/constant-values.html#java.awt.event.InputEvent.SHIFT_DOWN_MASK InputEvent.SHIFT_DOWN_MASK]: `64`
- `JTextField` + `InputMap`、または`KeyListener`、`MouseListener`
-- `(e.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) != 0`でKBD{Shift}キーが押されているかを判断する
-- `MouseEvent`は`InputEvent`を継承しているので、`MouseListener`内では`InputEvent#isShiftDown()`なども使用可能

----
- `JMenuItem`などがキー入力ではなくマウスでクリックされたかどうかは`(ActionEvent#getModifiers() & AWTEvent.MOUSE_EVENT_MASK) != 0`で判断可能

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/awt/event/ActionEvent.html ActionEvent (Java Platform SE 8)]
- [https://stackoverflow.com/questions/5592065/isshiftdown-when-jbutton-pressed java - isShiftDown when JButton pressed? - Stack Overflow]
- [https://mail.openjdk.java.net/pipermail/awt-dev/2018-October/014518.html <AWT Dev> creating an ActionEvent with modifiers from an InputEvent]
- [https://mail.openjdk.org/pipermail/awt-dev/2018-October/014518.html <AWT Dev> creating an ActionEvent with modifiers from an InputEvent]

* コメント [#comment]
#comment
#comment