JPopupMenu出现,但似乎没有反应

时间:2020-08-05 08:02:58

标签: java jpopupmenu

我无法正常运行JPopupMenu。

我期望的结果

一旦我用鼠标右键单击,菜单应该弹出。然后,我可以从菜单中选择一个项目,然后做我想做的任何事情。

我实际上得到的是什么

右键单击鼠标后菜单会出现,但是此后我无法选择菜单项,或者至少我错过了众所周知的鼠标悬停突出显示效果(我希望当前正在悬停的项目会突出显示,例如在普通菜单中就是这种情况。

此处出现问题(悬停时未突出显示):

enter image description here

这是我的示例代码:

package com.mycompany.mavenproject2;

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

public class PopupMenuTest {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel pane = new JPanel();
        JPopupMenu popup = new JPopupMenu();
        
        popup.add(new JMenuItem("A"));
        popup.add(new JMenuItem("B"));
        
        pane.setSize(300,300);
        pane.add(popup);
        pane.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if(SwingUtilities.isRightMouseButton(e)) {
                    popup.setLocation(e.getXOnScreen(), e.getYOnScreen());
                    popup.setVisible(true);
                }
            }
         });
        
        frame.setTitle("Test");
        frame.add(pane);
        frame.setPreferredSize(new Dimension(300,300));
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

修改

与悬浮时的“普通”菜单相比:

enter image description here

编辑#2

请查看当前(意外)行为:

1 个答案:

答案 0 :(得分:1)

您需要使用JPopupMenu show方法,而不是setVisible方法。

这是我测试过的代码。我正在运行Windows 10并使用符合Java 8的Java JDK 13.0.2。我将鼠标悬停在突出显示位置。

import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;

public class JPopupMenuTest implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new JPopupMenuTest());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame();

        JPanel pane = new JPanel();
        pane.setPreferredSize(new Dimension(300, 300));
        pane.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (SwingUtilities.isRightMouseButton(e)) {
                    JPopupMenu popup = new JPopupMenu();
                    popup.add(new JMenuItem("A"));
                    popup.add(new JMenuItem("B"));

                    popup.show(e.getComponent(), e.getX(), e.getY());
                }
            }
        });

        frame.setTitle("JPopupMenu Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(pane);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

}