java:在 Mac OsX 上禁用 TrayIcon 右键单击

2023-12-02

我正在尝试开发一个由系统托盘图标提供的 Mac OsX 应用程序,因此在第一次尝试使用最简单的代码来实现它后,我注意到 mac osX (10.8) 上的每个应用程序托盘图标(系统和用户应用程序)都允许通过左键和右键单击激活相对弹出菜单,但在我的项目中,只有左侧 (MouseEvent.BOTTON1) 按钮会导致弹出菜单下拉。这是我的代码:

public class SystemTrayDemo
{
    private SystemTray tray;
    private TrayIcon tray_icon;

    public SystemTrayDemo()
    {
        if (!SystemTray.isSupported())
        {
            JOptionPane.showMessageDialog(null, "System tray not supported!");
            return;
        }
        else
           tray = SystemTray.getSystemTray();

        final PopupMenu popup = new PopupMenu(); 

        MenuItem exit = new MenuItem("Exit");

        exit.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                if (tray != null)
                {                    
                    tray.remove(tray_icon);
                    System.exit(0);
                }
            }
        });

        popup.add(exit);

        //add tray icon
        tray_icon = new TrayIcon(getIcon("images/wifi.png"), "Open documents...", popup);
        tray_icon.setImageAutoSize(true);

        try
        {            
            tray.add(tray_icon); // adds icon
        }
        catch (AWTException ex) {}
    }


    private Image getIcon(String name)
    {
        URL _url = getClass().getResource(name);
        return new ImageIcon(_url).getImage();
    }

    public static void main(String args[])
    {
        new SystemTrayDemo();
    }
}

但我已经说过,只能通过单击鼠标左键。 因此,在进一步的尝试中,我尝试使用 MouseListener 模仿所有其他应用程序的托盘图标的行为,并使用dispatchEvent() 方法在右键单击事件上触发左键事件,如下所示:

    public static void fireMouseEvent(Component c)
    {
        MouseEvent me = new MouseEvent(c, // which
                    MouseEvent.MOUSE_CLICKED, // what
                    System.currentTimeMillis(), // when
                    MouseEvent.BUTTON1_MASK, // no modifiers
                    0, 0, // where: at (10, 10}
                    1, // only 1 click 
                    true); // popup trigger

        c.dispatchEvent(me);
    }

该事件将由鼠标侦听器处理,但显然 TrayIcon 类不是 Component 子类,因此 MouseEvent 的源为 null,我得到一个 NPE。这是我的鼠标监听器:

    class MouseAdapt extends java.awt.event.MouseAdapter
    {

        public void mouseClicked(java.awt.event.MouseEvent me)
        {
            int button = me.getButton();

            if(button == java.awt.event.MouseEvent.BUTTON3)
            {
                fireMouseEvent(me.getComponent());
            }
        }
    }

    try
    {            
        tray.add(tray_icon); // aggiungi l'icona
        tray_icon.addMouseListener(new MouseAdapt());
    }
    catch (AWTException ex) {}

抱歉我的英语不好,我希望曾经有过此类项目经验的人可以帮助我。我已经搜索了几个小时但没有运气。感谢您的帮助。


Edit:现在有一个库正在努力解决所有这些问题:https://github.com/dorkbox/SystemTray


通过左键和右键单击激活 [TrayIcon] 相关弹出菜单

目前这在 Mac + Java 上根本不可能。使用反射来调用底层触发器似乎没有帮助。这是一个错误。

https://bugs.openjdk.java.net/browse/JDK-8041890

只有左侧 (MouseEvent.BOTTON1) 按钮才会导致弹出菜单下拉。这是我的代码

即使这在某些 Java 版本(7u79)中也被破坏,通过升级修复...

https://bugs.openjdk.java.net/browse/JDK-7158615

跨平台 TrayIcon 支持:

虽然有点偏离主题,但我想补充一点,有些项目使用JXTrayIcon在 Linux/Windows 等中完成一些奇特的下拉菜单。这些也会在 Mac 上引起问题,尽管今天它已经遭受了点击错误以及错误Gnome3 需要完全独立的 hack。但在 Mac 上,任何使用装饰菜单的尝试都会导致菜单停留,对于最终用户来说是一种非常糟糕的体验。我决定的解决方案是使用适用于 Mac 的 AWT,适用于其他所有产品的 Swing。 Java TrayIcon 支持迫切需要重写。 JavaFX 声称会帮助这一举措,但它为 Java 9 上演。与此同时,我坚持依赖于操作系统的黑客.

其他平台的相关托盘问题

此外,一些 Linux 发行版(例如 Ubuntu)默认删除了 Unity 桌面中的托盘图标,这导致了进一步的麻烦。https://askubuntu.com/a/457212/412004

此外,在 Gtk/Gnome 或 Qt/KDE 支持的桌面上,图标的透明度被替换为灰色(OpenJDK 和 Oracle JRE 都受到此影响)https://stackoverflow.com/a/3882028/3196753 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521

此外,Gnome3 支持的桌面可能会在错误的角落显示它,或者根本不会显示它,或者它可能会显示但无法单击(OpenJDK 和 Oracle JRE 都会遇到这种情况)https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=660157 https://bugzilla.redhat.com/show_bug.cgi?id=1014448

除此之外,Windows 上的高 DPI 屏幕存在一个无法正确绘制图标的错误:Windows 8 扭曲了我的 TrayIcon

所以综上所述,Java中系统托盘的状态是可以的,但是由于综合因素的影响,在JDK6、JDK7和JDK8中系统托盘的状态是相当碎片化和有bug的。

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

java:在 Mac OsX 上禁用 TrayIcon 右键单击 的相关文章

随机推荐

  • 为什么在检查 textView 文本是否以预期字符串结尾(省略时)时 android espresso 测试失败

    我有一个 android 测试 检查应用 android ellipsize end 时外部文本消息是否被截断并以三个点结尾 我不知道为什么测试失败 尽管活动中呈现的文本格式正确 Test fun when errorMessage is
  • 为什么 Java 中有数组和数组

    我遇到过这两个文档 该类的 Java 文档Array 该类的 Java 文档Arrays 我想知道这两个类之间有什么区别 它们都提供了一组不同的静态方法 但为什么它们是分开的呢 更深层次的区别是什么 它们之间的关系与普通数组实例之间的关系是
  • stage 关键字是否在 YAML 文件中的 Azure DevOps 中定义构建或部署管道

    我想知道我们是否考虑这个 YAML 代码块 如果它已经被视为构建和发布管道 或者我们需要定义阶段来表征它 下面的代码可以工作 但运行时看不到各个阶段 然而 在这种情况下 它会构建并部署到 Azure 所以这就是我问的原因 我正在寻找正确的术
  • 限制线程数

    我有一个包含我要下载的项目的列表 我使用 for 循环来迭代列表 对于此列表中的每个项目 我启动一个引用该项目的新线程 我的问题是我想同时限制 maxDownload for int i downloadList Count 1 i gt
  • 在 XMPPFramework 和 Swift 2 中未调用 didReceiveInvitation()

    我正在创建聊天应用程序 例如Whatsapp 我已经成功编写了文本聊天 图像 音频 视频传输的功能 现在我正在创建多用户聊天 经过长时间的研发 我问这个问题 请告诉我我的代码中做错了什么 我已经遵循了所有这些教程 但运气不佳 https g
  • 在 Java Graphics2D 中,文本如何在矩形上居中对齐?

    在这段代码中 我有一个窗口 其中一个角落有一个蓝色框 我需要在此框上对齐文本中心 public class drawComponent extends JComponent public void paintComponent Graphi
  • Keras 不平衡数据集的多重损失

    My Model 我建立了一个暹罗网络 它有两个输入和三个输出 所以我的损失函数是 total loss alpha loss1 alpah loss2 1 alpah loss3 loss1 and loss2 is categorica
  • Google 搜索 API - 仅返回 4 个结果

    经过大量实验和谷歌搜索 以下 Python 代码成功调用了 Google 的搜索 APi 但只返回 4 个结果 在阅读了 Google 搜索 API 文档后 我认为 start 会返回其他结果 但这并没有发生 有人可以指点一下吗 谢谢 Py
  • 有没有办法确定 Apple Watch 和 iPhone 之间的粗略距离?

    我知道在 Apple Watch 发布之前这个问题可能无法解答 但有人知道是否有办法确定 Apple Watch 和 iPhone 之间的粗略距离 以英尺为单位 目前 WatchKit框架不会向您提供此类信息 因为第三方应用程序的功能仍然相
  • WCF 64 位不工作

    我正在尝试开发一个在 64 位环境中运行的简单 WCF 服务 我在Windows 7下启动VS2010 新解决方案 gt WCF 项目 gt 运行 gt 工作正常 一旦我更改项目的属性以使其在 64 位中编译 运行它就会抛出以下异常 Cou
  • 将多个 csv 文件平均为 r 中的 1 个平均文件

    我有大约 300 个风速 温度 压力等的 csv 文件 每列都是 2007 年到 2012 年的不同时间 每个文件都来自不同的位置 我想将所有文件合并为一个 即所有 300 个文件的平均值 因此 新文件中每个文件的行数和列数都相同 但每个单
  • Android - 清除 Facebook 访问令牌

    我有一个SettingsActivity其中有多种选项 包括查找 Facebook 好友和注销 因此 当用户选择查找她的 Facebook 好友时 她将被发送到另一个活动 我让她使用她的 Facebook 帐户登录并保存她的访问令牌 然后
  • 当容器是超链接时,Flex 图像不会随屏幕尺寸缩小

    有人可以告诉我这是否是 Flexbox 的一个未记录的错误 或者我只是做错了 我有 3 个图像在 div 容器内排成一行 这对人们来说很简单 如果没有任何超链接 所有 3 个图像都会按其应有的方式完美缩小 div style width 1
  • 有没有适用于 Java Swing 的优秀且免费的日期和时间选择器? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有没有适用于 Java Swing 的优秀且免费的日期和时间选择器 有很多可用的日期选择器 但没有日期和时间选择器 这是迄今为止我遇到的最接近的 寻找日期和时间选择器 Anybody
  • iOS 在 iOS 6 中隐藏标签栏会产生黑条(iOS 6 的修复会破坏 iOS 7!)

    我有一个选项卡式应用程序 在一个选项卡中有一个UIWebView 当我将设备旋转到横向时 我已经制作了UIWebView全屏显示 同时隐藏状态和标签栏 我已经在 iOS 6 中工作了 最初在旋转和隐藏选项卡栏时 它会在选项卡栏所在的位置留下
  • Spring引导redirectAttributes.addFlashAttribute不保留立即重定向中的值

    我有一个实现 GET POST GET 重定向模式的控制器类 我尝试在 POST 请求中使用 addFlashAttribute 并重定向到 GET 但 GET 中的模型对象不包含设置值 这是我的代码 Controller RequestM
  • 如何以编程方式更改 Eclipse 首选项

    应该采用什么方法来更改 Eclipse 首选项 它们存储在
  • 在 C# 中使用正则表达式突出显示单词列表

    我有一些包含缩写的网站内容 我有该网站公认的缩写列表及其解释 我想创建一个正则表达式 它允许我用一些标记替换内容中找到的所有可识别的缩写 例如 内容 This is just a little test of the memb to see
  • 使选定的文本视图字符串变为粗体、斜体、下划线,就像 iOS 的本机“Notes”应用程序一样

    是否有任何帮助可以使选定的文本字符串视图变为粗体 斜体 下划线 就像 iOS 的本机 Notes 应用程序一样 请给我有用的链接 我厌倦了一整天的寻找 非常感谢 我附上了我的代码 使属性字符串粗体和斜体都像iPhone Notes 的本机应
  • java:在 Mac OsX 上禁用 TrayIcon 右键单击

    我正在尝试开发一个由系统托盘图标提供的 Mac OsX 应用程序 因此在第一次尝试使用最简单的代码来实现它后 我注意到 mac osX 10 8 上的每个应用程序托盘图标 系统和用户应用程序 都允许通过左键和右键单击激活相对弹出菜单 但在我