JPopupMenu 出现但似乎没有反应

JPopupMenu appears but seems to not react

我无法让 JPopupMenu 正常工作。

我期待的

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

我实际得到的

右键单击后会出现菜单,但之后我无法 select 菜单项,或者至少我缺少众所周知的鼠标悬停突出显示效果(我希望我是当前悬停是突出显示的,就像普通菜单中的情况一样)。

这里看到的问题(悬停时没有突出显示):

这是我的示例代码:

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

编辑

与具有工作悬停功能的“普通”菜单比较:

编辑#2

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

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

这是我测试过的代码。我是 运行 Windows 10 并使用符合 Java JDK 13.0.2 的 Java 8。我在鼠标上得到高亮显示。

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

}