java - JPopupMenu 行为 OSX 10.6.7

标签 java swing macos jpopupmenu

我的问题是,当我右键单击下面示例中的 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();
}
}

最佳答案

可以添加一个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);
            }
        });

关于java - JPopupMenu 行为 OSX 10.6.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6799643/

相关文章:

java - 使用 Apache POI 替换相关单元格后评估公式

java - JTable 帮助(调整标题和数据源的大小)

java - 如何异步触发JProgressBar?

perl - 如何在 OSX Snow Leopard 10.6 上安装 perl DBD::Oracle

objective-c - 在 Cocoa 应用程序中跟踪实际使用时间

java - 如何在java中将DataFlavor[]保存为图像文件?

Java Criteria API 类似条件

java - 将 .txt 文件的内容读入二维字符串 ARRAYLIST

java - 如何在 JFreechart 图表上绘制多个图表

objective-c - Objective-C 中的类是对象吗?