Java JPOppMenu行为OSX 10.6.7

Java JPOppMenu行为OSX 10.6.7,java,swing,macos,jpopupmenu,Java,Swing,Macos,Jpopupmenu,我的问题是,在下面的示例中,当我右键单击JFrame时,会显示JPopupMenu,但是如果我单击JFrame之外的任何地方,菜单不会消失。我必须点击JFrame上的某个地方来摆脱它,这不是预期的行为。以下是复制的步骤: 从Eclipse运行窗口类(出现JFrame) 点击进入Eclipse工作区(JFrame失去焦点,隐藏在Eclipse后面) 最小化Eclipse(出现JFrame) 将鼠标放在JFrame上,右键单击(弹出窗口) 单击某个位置(不是进入JFrame或弹出窗口)。弹出窗口不会

我的问题是,在下面的示例中,当我右键单击JFrame时,会显示JPopupMenu,但是如果我单击JFrame之外的任何地方,菜单不会消失。我必须点击JFrame上的某个地方来摆脱它,这不是预期的行为。以下是复制的步骤:

  • 从Eclipse运行窗口类(出现JFrame)
  • 点击进入Eclipse工作区(JFrame失去焦点,隐藏在Eclipse后面)
  • 最小化Eclipse(出现JFrame)
  • 将鼠标放在JFrame上,右键单击(弹出窗口)
  • 单击某个位置(不是进入JFrame或弹出窗口)。弹出窗口不会消失
  • 我正在运行OS X 10.6.7和Java完整版1.6.0_24-b07-334

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    class test
    {
    
    static class window extends JFrame implements MouseListener,
            MouseMotionListener
    {
    
        JPopupMenu popMenu;
        JPanel panel = new JPanel();
    
        Point location;
        MouseEvent pressed;
    
        public window()
        {
    
            addMouseListener(this);
            addMouseMotionListener(this);
    
            JLabel label = new JLabel("JFrame", JLabel.CENTER);
    
            initPopMenu();
            add(label);
            setUndecorated(true);
            setVisible(true);
    
            // setAlwaysOnTop(true);
            setLocationRelativeTo(null);
            pack();
        }
    
        public void initPopMenu()
        {
            popMenu = new JPopupMenu();
            JMenuItem item;
    
            item = new JMenuItem("Title");
            item.setEnabled(false);
            popMenu.add(item);
            popMenu.addSeparator();
    
            item = new JMenuItem("Item One");
            popMenu.add(item);
    
            item = new JMenuItem("Item 2");
            popMenu.add(item);
    
            item = new JMenuItem("Item 3");
            popMenu.add(item);
        }
    
        public void mousePressed(MouseEvent e)
        {
            pressed = e;
            int nModifier = e.getModifiers();
            if (((nModifier & InputEvent.BUTTON2_MASK) != 0)
                    || ((nModifier & InputEvent.BUTTON3_MASK) != 0))
                popMenu.show( this, e.getX(), e.getY() );
        }
    
        public void mouseClicked(MouseEvent e)
        {
        }
    
        public void mouseReleased(MouseEvent e)
        {
        }
    
        public void mouseDragged(MouseEvent me)
        {
        }
    
        public void mouseMoved(MouseEvent e)
        {
        }
    
        public void mouseEntered(MouseEvent e)
        {
        }
    
        public void mouseExited(MouseEvent e)
        {
        }
    }
    
    public static void main(String[] args)
    {
        window dw = new window();
    }
    }
    

    您可以添加windowFocusListener,在窗口失去焦点时隐藏菜单

            this.addWindowFocusListener(new WindowFocusListener() {
                @Override
                public void windowLostFocus(WindowEvent e) {
                    if(popMenu != null){
                        popMenu.setVisible(false);
                    }
                }
                @Override
                public void windowGainedFocus(WindowEvent e) {
                    //System.out.println(e);
                }
            });
    

    看,我还在等待答案。OSX世界中没有人有同样的问题?如果你得到答案,请分享。我在Mac OSXA上也遇到了同样的问题,类似的问题后来在上报告时使用了不同的JPopupMenus实现。我认为这是Mac OS X的Java端口中的一个bug,最好是提交一份bug报告。我不知道你的意思是什么,但使用你的测试代码它工作得很好。我从eclipse(JFrame出现)2运行窗口类。我点击进入eclipse工作区(JFrame失去焦点,隐藏在eclipse后面)3。最小化eclipse(出现JFrame)4。将鼠标放在JFrame上,右键单击(弹出窗口)5。点击某个地方(不是进入JFrame或弹出窗口),弹出窗口不会消失