Search code examples
javaswingjpopupmenujmenuitem

How to prevent a disabled JMenuItem from hiding the menu when being clicked?


In my Java swing application i have noticed that when i click on a disabled JMenuItem in a JPopupMenu it hides the menu, but i i do not want to hide it, as if nothing is clicked. Is there a way to prevent this ?

-----------------------------------> Update: Added Code sample :

JMenuItem saveMenuItem = new JMenuItem();

saveMenuItem.setEnabled(false);

saveMenuItem.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        saveMenuItemActionPerformed();
    }
});
add(saveMenuItem);

private void saveMenuItemActionPerformed() {
    System.out.println( "Save clicked." );
}

Solution

  • This has been tested and works.

    The Look & Feel decides how to handle the mouse events on disabled menu items. Anyway, you can intercept the undesired events by using a custom MenuItem. Simply use that code (copy/paste):

    public class CustomMenuItem extends JMenuItem {
    
        public CustomMenuItem(String text) {
            super(text);
        }
    
        public CustomMenuItem() {
            super();
        }
    
        protected void processMouseEvent(MouseEvent e) {
            if (isEnabled()) super.processMouseEvent(e);
        }
    }
    

    First, adapt the code to suit your needs (optional).
    Finally, replace any JMenuItem with a CustomMenuItem.

    That's it!