0

次の構造JPopupMenuJPanelありますJMenuItems。問題は、いつでもJPopupMenu消えるので使えないことです。mouse entersmenu 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

いくつかのヒント:

  • ボタンが押されるたびにポップアップ メニューを定義するのではなく、1 回だけ定義します。

  • mouseReleasedオーバーライドまたはmousePressedメソッドが必要です:ポップアップ メニューの表示

  • ポップアップを表示するかどうかを調べるには、MouseEvent.isPopupTriggerを使用します。

  • menuItemsに直接追加し、に追加しmenuない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 に答える