Swing/ActionEventModifiers の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/ActionEventModifiers へ行く。
- 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 --- * 概要 [#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