SeniorJD
SeniorJD

Reputation: 7202

JPopupMenu disappears on mouseEntered

I have next structure: JPopupMenu contains JPanel which contains JMenuItems. The problem is, I cannot use it because JPopupMenu disappears when mouse enters to any menu item.

SSCCE:

public class PopupTest {
    public static void main(String[] a) {
        final JFrame frame = new JFrame();
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createLineBorder(Color.RED));

        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (e.getButton() == MouseEvent.BUTTON3) {
                    final JPopupMenu menu = new JPopupMenu();
                    JPanel menuPanel = new JPanel();
                    menuPanel.setBorder(BorderFactory.createLineBorder(Color.GREEN));
                    menuPanel.setLayout(new BoxLayout(menuPanel, BoxLayout.Y_AXIS));

                    for (int i = 0; i < 10; i++) {
                        JMenuItem item = new JMenuItem(String.valueOf(i));
                        menuPanel.add(item);
                    }

                    menu.add(menuPanel);
                    menu.show(panel, e.getX(), e.getY());
                }
            }
        });
        frame.setContentPane(panel);
        frame.setUndecorated(true);
        frame.setBackground(new Color(50, 50, 50, 200));

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                frame.setVisible(true);
            }
        });
    }
}

BTW, problem does not repeats when there is no JPanel between JPopupMenu and its items.

Does anyone know how to prevent that?

Upvotes: 0

Views: 767

Answers (2)

dic19
dic19

Reputation: 17971

Some tips:

  • Define your pop up menu just once instead every time a button is pressed.

  • You need to override mouseReleased or mousePressed method: Bringing Up a Popup Menu

  • Use MouseEvent.isPopupTrigger to find out if pop up should be shown.

  • Add menuItems directly to menu and not to a JPanel

Suggested changes:

    final JPopupMenu menu = new JPopupMenu();
    menu.setLayout(new GridLayout(2,5)); // How do you can, for example, lay out your menu items horizontally in 2 rows?
    for (int i = 0; i < 10; i++) {
        JMenuItem item = new JMenuItem(String.valueOf(i));
        menu.add(item);
    }

    MouseListener mouseListener = new MouseAdapter() {
        @Override
        public void mouseReleased(MouseEvent e) {
            if(e.isPopupTrigger()){
                menu.show(panel, e.getX(), e.getY());
            }
        }
    };

    panel.addMouseListener(mouseListener);

Picture

enter image description here

Upvotes: 1

Sage
Sage

Reputation: 15418

Not directly answering your question but I think, you are unnecessarily adding a panel with box layout to JPopupMenu when it supports adding JMenuitem directly to it. check the following code fragment:

                 final JPopupMenu menu = new JPopupMenu();
                   JPanel menuPanel = new JPanel();
                    menuPanel.setBorder(BorderFactory.createLineBorder(Color.GREEN));
                  //  menuPanel.setLayout(new BoxLayout(menuPanel, BoxLayout.Y_AXIS));

                    for (int i = 0; i < 10; i++) {
                             JLabel item = new JLabel(i+"");
                             menuPanel.add(item);
                            }

                    menu.add(menuPanel);

                    menu.show(panel, e.getX(), e.getY());

Upvotes: 1

Related Questions