• 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

概要

JButtonJMenuItemがクリックされたとき、同時にShiftキーなどが押下されているかをテストします。

サンプルコード

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) != 0Shiftキーが押されているかを判断する
    • ActionListener内で(e.getModifiers() & InputEvent.SHIFT_MASK) != 0InputEvent.SHIFT_MASKを使用すべきではない
    • どちらも定数値は1だがInputEvent.SHIFT_MASKはキーストローク用、またJava 9からInputEvent.SHIFT_MASKは非推奨でInputEvent.SHIFT_DOWN_MASKを使うべき
    • InputEvent.SHIFT_DOWN_MASKInputEvent.getModifiersEx()と合わせて使用する
    • MouseEventKeyEventInputEventを継承しているが、ActionEventは継承していないのでgetModifiersEx()メソッドは存在しない
  • JTextField + InputMap、またはKeyListenerMouseListener
    • (e.getModifiersEx() & InputEvent.SHIFT_DOWN_MASK) != 0Shiftキーが押されているかを判断する
    • MouseEventInputEventを継承しているので、MouseListener内ではInputEvent#isShiftDown()なども使用可能

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

参考リンク

コメント