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
概要
JMenu
とJMenuItem
をマウスの右クリックで選択してもWindowsLookAndFeel
の場合は無効になるよう設定します。
Screenshot
Advertisement
サンプルコード
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);
}
};
}
}
View in GitHub: Java, Kotlin解説
Default
- デフォルトの
WindowsLookAndFeel
では、JMenu
やJMenuItem
を右クリックで選択可能
- デフォルトの
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()
で生成されるMouseInputListener
をBasicMenuItemUI.MouseInputHandler#mousePressed(...)
をオーバーライドしたリスナーに置き換えSwingUtilities.isRightMouseButton(e)
で右クリックの場合はなにも実行しない
- デフォルトの
JMenu
にsetComponentPopupMenu(...)
でJPopupMenu
を追加するとアプリケーションを終了するまで閉じることのできないJPopupMenu
が開くバグ?がある- このサンプルのように右クリックを無効かしてもこの動作を修正できない
参考リンク
- JComboBoxのドロップダウンリストで右クリックを無効化
- [JDK-5032188] Right Click on The JMenu Drops down the Menu unlike Native - Java Bug System