1

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

  1. 从 Eclipse 运行窗口类(出现 JFrame)
  2. 单击进入 Eclipse 工作区(JFrame 失去焦点并隐藏在 Eclipse 后面)
  3. 最小化 Eclipse(出现 JFrame)
  4. 将鼠标移到 JFrame 上并单击鼠标右键(出现弹出窗口)
  5. 单击某处(不在 JFrame 或 Popup 中)。弹出窗口不会消失

我正在运行 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();
}
}
4

1 回答 1

0

你可以添加一个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);
            }
        });
于 2011-07-23T14:05:11.420 回答