Swing/DisableRightClickOnMenu のバックアップ差分(No.3)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/DisableRightClickOnMenu へ行く。
- 1 (2020-03-16 (月) 00:37:55)
- 2 (2020-03-16 (月) 04:49:48)
- 3 (2020-03-16 (月) 19:23:05)
- 4 (2021-09-07 (火) 17:00:09)
- 5 (2022-08-20 (土) 22:15:25)
- 追加された行はこの色です。
- 削除された行はこの色です。
---
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
---
* 概要 [#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)`で右クリックの場合はなにも実行しない
----
- デフォルトの`JMenu`に`setComponentPopupMenu(...)`で`JPopupMenu`を追加するとアプリケーションを終了するまで閉じることのできない`JPopupMenu`が開くバグ?がある
-- このサンプルのように右クリックを無効かしてもこの動作を修正できない
* 参考リンク [#reference]
- [[JComboBoxのドロップダウンリストで右クリックを無効化>Swing/DisableRightClick]]
- [https://bugs.openjdk.java.net/browse/JDK-5032188 [JDK-5032188] Right Click on The JMenu Drops down the Menu unlike Native - Java Bug System]
* コメント [#comment]
#comment
#comment