JMenuとJMenuItemで右クリックによる選択を無効にする
Total: 1618
, Today: 5
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
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) {
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
では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