Summary

MouseEventから各マウスボタンのクリック状態を取得し、図形を組み合わせて作成したマウス型のIcon上に描画することで視覚化します。

Source Code Examples

enum MouseButton {
  LEFT, MIDDLE, RIGHT
}

// ...
visualizerLabel.addMouseListener(new MouseAdapter() {
  @Override public void mousePressed(MouseEvent e) {
    updateButton(e, true);
  }

  @Override public void mouseReleased(MouseEvent e) {
    updateButton(e, false);
  }
});
// ...
private void updateButton(MouseEvent e, boolean isPressed) {
  MouseButton btn = null;
  if (SwingUtilities.isLeftMouseButton(e)) {
    btn = MouseButton.LEFT;
  } else if (SwingUtilities.isMiddleMouseButton(e)) {
    btn = MouseButton.MIDDLE;
  } else if (SwingUtilities.isRightMouseButton(e)) {
    btn = MouseButton.RIGHT;
  }
  if (btn != null) {
    if (isPressed) {
      pressedButtons.add(btn);
    } else {
      pressedButtons.remove(btn);
    }
    logEvent((isPressed ? "Pressed: " : "Released: ") + btn);
    visualizerLabel.repaint();
  }
}
View in GitHub: Java, Kotlin

Description

  • 上部: JLabel
    • JLabelMouseListenerを追加し、マウスボタンのクリックイベントを取得可能に設定
    • 図形を組み合わせてマウス型のIconを作成し、上記のJLabelに設定
    • どのボタンがクリックされたかはMouseEvent#getButton()BUTTON1BUTTON2BUTTON3かを調べる方法や、InputEvent#getModifiersEx()で取得したキー状態int modifiers(modifiers & InputEvent.BUTTON1_MASK) != 0のようにBUTTON1_MASKBUTTON2_MASKBUTTON3_MASKフラグが立っているかなどで調査する方法があるが、このサンプルではSwingUtilitiesに用意された以下のメソッドを使用して判別している
    • マウスボタンが押されたかリリースされたかはboolean isPressed = e.getID() == MouseEvent.MOUSE_PRESSED;で調査可能だが、このサンプルではMouseListener#mousePressed(...)MouseListener#mouseReleased(...)のどちらでMouseEventを受け取ったかで判断している
    • enumMouseButtonを作成し、EnumSet<MouseButton>で各マウスボタンのクリック状態を管理することでマウスボタンの同時押しを視覚化可能にしている
    • マウス型アイコンは以下の図形を組み合わせて作成
      • 本体はRoundRectangle2Dのランウド矩形で作成
      • 左マウスボタンは上左半分のRectangleと本体の共通エリアをArea#intersect(bodyArea)で抜き出すことで作成
      • 右マウスボタンは上右半分のRectangleと本体の共通エリアをArea#intersect(bodyArea)で抜き出すことで作成
      • 中央マウスボタンはRoundRectangle2Dで作成したランウド矩形を本体上半分の中央に上書きで配置することで表現
  • 下部: JTextArea

Reference

Comment