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

概要

JMenuJMenuItemをマウスの右クリックで選択してもWindowsLookAndFeelの場合は無効になるよう設定します。

サンプルコード

class CustomWindowsMenuUI extends WindowsMenuUI {
  @Override protected MouseInputListener createMouseInputListener(JComponent c) {
    return new BasicMenuItemUI.MouseInputHandler() {
      @Override public void mousePressed(MouseEvent e) {
        if (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);
      }
    };
  }
}
View in GitHub: Java, Kotlin

解説

  • Default
    • デフォルトのWindowsLookAndFeelでは、JMenuJMenuItemを右クリックで選択可能
  • DisableRightClick
    • WindowsLookAndFeelが設定されている場合はマウスの右クリックを無効にするCustomWindowsMenuUIを設定
      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()で生成されるMouseInputListenerBasicMenuItemUI.MouseInputHandler#mousePressed(...)をオーバーライドしたリスナーに置き換え
  • SwingUtilities.isRightMouseButton(e)で右クリックの場合はなにも実行しない

  • デフォルトのJMenusetComponentPopupMenu(...)JPopupMenuを追加するとアプリケーションを終了するまで閉じることのできないJPopupMenuが開くバグ?がある
    • このサンプルのように右クリックを無効化してもこの動作を修正できない

参考リンク

コメント