JPopupMenu 行为

2023-12-25

我在下面准备了一个小测试用例。我的问题是当我右键单击窗口时。 JPopupMenu 显示,但如果我单击 JWindow 菜单之外的任何位置都不会消失。我必须单击窗口上的某个位置才能将其删除,这不是预期的行为。

编辑: 阅读 akf 的答案后,我切换到 JFrame,当框架处于焦点并且弹出菜单显示时,当您单击另一个窗口时,它会消失。但如果窗口没有焦点并且您单击某处菜单不会消失。


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class test {

    static class window extends JWindow
    implements MouseListener, MouseMotionListener{

    JPopupMenu popMenu;
    JPanel panel = new JPanel();

    Point location;
    MouseEvent pressed;

    public window(){

        addMouseListener( this );
        addMouseMotionListener( this );

        JLabel label = new JLabel("JWindow", JLabel.CENTER);

        initPopMenu();
        add(label);
        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();
    }
}

查看 Java 文档JWindow.isFocusableWindow http://java.sun.com/javase/6/docs/api/javax/swing/JWindow.htmlJWindow 不能成为焦点窗口,除非它有所有者并且所有者可见。 您正在使用默认构造函数,因此您的 JWindow 具有共享所有者 asn 不可聚焦。当它不可聚焦时,当您单击其他位置时,它无法检测到焦点丢失。

我变了JWindow to JFrame并添加了一个调用setUndecorated(true);在致电之前setVisible它对我有用。如果这些更改不适合您,请发布您正在使用的 Java 版本:java -fullversion

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPopupMenu 行为 的相关文章

随机推荐

  • 我可以从服务器将多个 zip 文件下载到一个 zip 文件中吗?

    我想从服务器下载多个 zip 文件 并在下载所有 zip 文件时附加并从服务器下载为一个 zip 文件 将所有 zip 文件打包到例如当前目录并将其发送到浏览器 尝试 header Content Type archive zip pass
  • 我怎样才能安全地向上转型可选? [复制]

    这个问题在这里已经有答案了 假设我有一个Optional
  • 在 Julia-lang 中生成热图的子图

    我正在尝试生成一个具有多个热图 根据单元格值具有颜色阴影的矩阵 的图形 图 眼下using Plots pyplot and heatmap mat 足以生成热图 我不清楚如何用更多的东西来制作一个图形 看完这个页面后示例子图 https
  • 如何分析约 13GB 的数据?

    我有大约 300 个文本文件 其中包含有关跟踪器 种子和对等点的数据 每个文件的组织方式如下 跟踪器 txt time torrent time peer time peer time torrent 我每个跟踪器有几个文件 并且许多信息是
  • 翻转关联数组并将新值存储在子数组中以防止丢失重复值

    我有一个可能包含重复值的平面关联数组 Array for juniors gt product category for men gt product category coats gt product category for women
  • 删除 .vagrant 文件后如何销毁虚拟机?

    我删除了包含 vagrant 文件的目录 当我安装新的虚拟机时 它抱怨端口正在使用中 那么如何在没有 vagrant 文件的情况下销毁虚拟机呢 以下 VirtualBox 命令可能会有所帮助 如果关闭电源不起作用 请尝试取消注册虚拟机 VB
  • 未捕获的类型错误:(0,_firebase.auth)不是函数

    尝试在 React 应用程序中使用 Firebase 身份验证 我按照 firbase 文档中的说明进行操作 使用 npm 安装 firebase 添加了 firebase js 文件 import as firebase from fir
  • GCP Cloud SDK 在 MAC 中安装失败

    无法使用从 gcloud 下载的包 google cloud sdk 307 0 0 darwin x86 64 tar gz 安装 gcloud sdk 支持的 Python 版本为 3 5 至 3 7 以及 2 7 9 或更高版本 这是
  • 使用 Ajax 的 URL 操作参数

    我正在尝试使用参数将数据从视图传递到控制器 现在我遇到了一些困难 一旦我从表中选择一行并按下具有 ShowTasks 的 onclick 方法的按钮 我就尝试传递这些参数 C 控制器 Route service delivery id sh
  • NullPointerException:println 需要一条消息[重复]

    这个问题在这里已经有答案了 我知道我有一个空指针 但我不知道它出现在哪里或为什么 希望在这里能得到一些帮助 Button add Button findViewById R id addfencebutton add setOnClickL
  • 使用WebView.goBack()方法时如何重新发送POST数据?

    我正在开发一个应用程序 我们为用户提供导航回用户之前查看过的网页的选项 当用户导航回包含 POST 数据的页面时 就会出现问题 我不知道如何检测 WebView 中加载的页面是否有 POST 数据 以便应用程序可以提示确认对话框 无论他是否
  • CodeIgniter 中的 set_value() 默认值

    我使用 formigniter 生成 CI 表单 http formigniter org http formigniter org 那一点效果很好 但是我想为名称字段设置默认值 输入代码如下所示
  • tput cols 在脚本中无法正常工作

    我在脚本中使用 tput cols 一切正常 除非窗口最大化 我的脚本能够正确获取任何窗口大小 但是当窗口最大化时 它会得到错误的值 80 然后我直接在终端中输入 tput cols 然后得到正确的大小 158 所以我的问题是 即使窗口最大
  • ASP.NET 和 Visual Studio - 添加项目引用与 Bin 文件夹 DLL

    我昨天刚刚开始一份新工作 这只是我在 ASP NET 方面的第二份工作 我们正在设置我的开发盒 并且在使用一些第三方组件 例如 Telerik 等 时遇到了问题 我注意到他们安装了这些第三方工具 寻找 DLL 文件 将它们复制到 bin 中
  • cakephp auth组件,使用两种模型

    我的网站有一个供员工使用的公共部分和一个供管理员使用的后端 它使用两种不同的模型 员工模型和管理员模型 我想使用身份验证组件进行员工登录和管理员登录 我知道如何设置 Auth 组件以使用默认用户模型以外的模型 但是我可以让身份验证组件使用两
  • Python——检查对象是否是某个模块中任何类的实例

    需要一种方法来检查对象是否是某个特定模块中任何类的实例 我知道我可以通过从该模块显式导入每个类并检查元组来做到这一点 from my module import ClassOne ClassTwo gt gt gt isinstance m
  • RabbitMQ 和 ActiveMQ 在同一台机器上运行

    出于测试目的 我需要在同一台 Windows 计算机上运行 ActiveMQ 和 RabbitMQ 我已经安装了两者 但无法一起运行它们 我需要停止一项服务才能运行另一项服务 这是我尝试启动运行 ActiveMQ 的 RabbitMQ 时遇
  • 在 Laravel 中迁移表时出现“SQLSTATE[HY000] [2002] No such file or directory”错误

    当我尝试使用 php artisan migrate 命令迁移 Laravel 5 中的表时 出现以下错误 SQLSTATE HY000 2002 中没有这样的文件或目录 vendor laravel framework src Illum
  • 使用代码进行 Entity Framework Core 1.0 代码优先迁移?

    在实体框架的早期版本中 可以使用 DbMigrator 类以编程方式控制代码优先迁移 例如 检查并应用可用迁移 该类是否仍然存在于某处或者是否有功能替代 我发现了一篇关于早期 RC 版本的帖子 其中指出了替代品 但 Core 1 0 中似乎
  • JPopupMenu 行为

    我在下面准备了一个小测试用例 我的问题是当我右键单击窗口时 JPopupMenu 显示 但如果我单击 JWindow 菜单之外的任何位置都不会消失 我必须单击窗口上的某个位置才能将其删除 这不是预期的行为 编辑 阅读 akf 的答案后 我切