0

我有下一个结构:JPopupMenucontains JPanelwhich contains JMenuItems。问题是,我不能使用它,JPopupMenu因为mouse enters任何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);
            }
        });
    }
}

顺便说一句,当没有JPanel之间JPopupMenu和它的项目时,问题不会重复。

有谁知道如何防止这种情况?

4

2 回答 2

1

一些技巧:

  • 每次按下按钮时,只需定义一次弹出菜单。

  • 您需要覆盖mouseReleasedmousePressed方法:Bringing Up a Popup Menu

  • 使用MouseEvent.isPopupTrigger确定是否应显示弹出窗口。

  • 直接添加menuItemsmenu而不是添加到JPanel

建议更改:

    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);

图片

在此处输入图像描述

于 2013-10-09T14:58:46.263 回答
1

没有直接回答你的问题,但我认为,当它支持直接添加到它时,你不必要地添加一个panel带有框的布局。检查以下代码片段:JPopupMenuJMenuitem

                 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());
于 2013-10-09T14:54:18.883 回答