javaswingcontextmenujpopupmenu

How do I create a right click context menu in Java Swing?


I'm currently creating a right-click context menu by instantiating a new JMenu on right click and setting its location to that of the mouse's position... Is there a better way?


Solution

  • You are probably manually calling setVisible(true) on the menu. That can cause some nasty buggy behavior in the menu.

    The show(Component, int x, int x) method handles all of the things you need to happen, (Highlighting things on mouseover and closing the popup when necessary) where using setVisible(true) just shows the menu without adding any additional behavior.

    To make a right click popup menu simply create a JPopupMenu.

    class PopUpDemo extends JPopupMenu {
        JMenuItem anItem;
        public PopUpDemo() {
            anItem = new JMenuItem("Click Me!");
            add(anItem);
        }
    }
    

    Then, all you need to do is add a custom MouseListener to the components you would like the menu to popup for.

    class PopClickListener extends MouseAdapter {
        public void mousePressed(MouseEvent e) {
            if (e.isPopupTrigger())
                doPop(e);
        }
    
        public void mouseReleased(MouseEvent e) {
            if (e.isPopupTrigger())
                doPop(e);
        }
    
        private void doPop(MouseEvent e) {
            PopUpDemo menu = new PopUpDemo();
            menu.show(e.getComponent(), e.getX(), e.getY());
        }
    }
    
    // Then on your component(s)
    component.addMouseListener(new PopClickListener());
    

    Of course, the tutorials have a slightly more in-depth explanation.

    Note: If you notice that the popup menu is appearing way off from where the user clicked, try using the e.getXOnScreen() and e.getYOnScreen() methods for the x and y coordinates.