JMenuとJMenuItemで右クリックによる選択を無効にする
Total: 2202, Today: 1, Yesterday: 3
Posted by aterai at
Last-modified:
Summary
JMenuとJMenuItemをマウスの右クリックで選択してもWindowsLookAndFeelの場合は無効になるよう設定します。
Screenshot

Advertisement
Source Code Examples
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, KotlinDescription
Default- デフォルトの
WindowsLookAndFeelではJMenuやJMenuItemを右クリックで選択可能
- デフォルトの
DisableRightClickWindowsLookAndFeelが設定されている場合はマウスの右クリックを無効にする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が開くバグ?がある- このサンプルのように右クリックを無効化してもこの動作を修正できない
Reference
- JComboBoxのドロップダウンリストで右クリックを無効化
- [JDK-5032188] Right Click on The JMenu Drops down the Menu unlike Native - Java Bug System