---
category: swing
folder: DisableRightClickOnMenu
title: JMenuとJMenuItemで右クリックによる選択を無効にする
tags: [JMenu, JMenuItem, WindowsLookAndFeel]
author: aterai
pubdate: 2020-03-16T00:36:39+09:00
description: JMenuとJMenuItemをマウスの右クリックで選択してもWindowsLookAndFeelの場合は無効になるよう設定します。
image: https://drive.google.com/uc?id=1RIzzl_rzPcMQIQGm9YL20ghL-xJKtT34
---
* 概要 [#summary]
JMenuとJMenuItemをマウスの右クリックで選択してもWindowsLookAndFeelの場合は無効になるよう設定します。

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

* サンプルコード [#sourcecode]
#code(link){{
class CustomWindowsMenuUI extends WindowsMenuUI {
  @Override protected MouseInputListener createMouseInputListener(JComponent c) {
    return new BasicMenuItemUI.MouseInputHandler() {
      @Override public void mousePressed(MouseEvent e) {
        JMenu menu = (JMenu) menuItem;
        if (!menu.isEnabled() || SwingUtilities.isRightMouseButton(e)) {
          return;
        }
        super.mousePressed(e);
      }
    };
  }
}

class CustomWindowsMenuItemUI extends WindowsMenuItemUI {
  @Override protected MouseInputListener createMouseInputListener(JComponent c) {
    return new BasicMenuItemUI.MouseInputHandler() {
      @Override public void mouseReleased(MouseEvent e) {
        if (!menuItem.isEnabled() || SwingUtilities.isRightMouseButton(e)) {
          return;
        }
        super.mouseReleased(e);
      }
    };
  }
}
}}

* 解説 [#explanation]
- `Default`
-- デフォルトの`WindowsLookAndFeel`では、`JMenu`や`JMenuItem`を右クリックで選択可能
- `DisableRightClick`
-- `WindowsLookAndFeel`が設定されている場合はマウスの右クリックを無効にする`CustomWindowsMenuUI`を設定
#code{{
JMenu menu1 = new JMenu("DisableRightClick") {
  @Override public void updateUI() {
    super.updateUI();
    if (getUI() instanceof WindowsMenuUI) {
      setUI(new CustomWindowsMenuUI());
    }
  }

  @Override public JMenuItem add(String s) {
    JMenuItem item = new JMenuItem(s) {
      @Override public void updateUI() {
        super.updateUI();
        if (getUI() instanceof WindowsMenuItemUI) {
          setUI(new CustomWindowsMenuItemUI());
        }
      }
    };
    return add(item);
  }
};
}}

-- `WindowsMenuUI#createMouseInputListener()`で生成される`MouseInputListener`を`BasicMenuItemUI.MouseInputHandler#mousePressed(...)`をオーバーライドしたリスナーに置き換え
-- `SwingUtilities.isRightMouseButton(e)`で右クリックの場合はなにも実行しない

* 参考リンク [#reference]
- [[JComboBoxのドロップダウンリストで右クリックを無効化>Swing/DisableRightClick]]

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