无法在macOS Catalina10.15.6上执行java.awt.Tray.removeTrayIcon

问题描述

我面临与this问题相同的问题。我正在尝试提供更多信息,以便获得一些答案。

我创建了一个要包含在系统托盘中的基于JavaFX的应用程序,然后使用属于系统托盘图标的菜单栏启用显示关闭该应用程序。我已经使用this answer,尤其是this coding example来将应用程序部署到任务栏中。

就像其他遇到相同问题的线程所描述的那样,我在尝试退出应用程序时遇到了问题。我已经设置了Platform.setImplicitExit(false),并且正在调用退出该应用程序的单独方法

    private void exit() {
        Platform.exit();
        tray.remove(trayIcon);
    }

我已经创建了该应用程序的可执行jar文件。如果我在Windows上运行它,一切正常。

如果我在Mac上运行它,则执行Platform.exit()行,然后,下一行将无处可用。没有崩溃,也没有例外,并且没有在合理的时间内结束(等待了30分钟,但我确定几个小时后也不会发生任何事情)。

我唯一的想法是在this page的帮助下进行Java线程转储。

"JavaFX Application Thread" #12 prio=5 os_prio=31 tid=0x00007fe87a92a000 nid=0x307 in Object.wait() [0x00007ffee2157000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:502)
    at java.awt.EventQueue.invokeAndWait(EventQueue.java:1343)
    - locked <0x00000007964a8e50> (a java.awt.EventQueue$1AWTInvocationLock)
    at java.awt.Window.dodispose(Window.java:1210)
    at java.awt.Window.dispose(Window.java:1147)
    at sun.lwawt.macosx.CTrayIcon.dispose(CTrayIcon.java:140)
    at java.awt.TrayIcon.removeNotify(TrayIcon.java:707)
    at java.awt.SystemTray.remove(SystemTray.java:312)
    - locked <0x0000000795c81ad8> (a java.awt.SystemTray)
    at com.valcoba.vCom.gui.VComController.exit(VComController.java:574)
    at com.valcoba.vCom.gui.VComController$$Lambda$308/1272434810.run(UnkNown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295)
    at com.sun.javafx.application.PlatformImpl$$Lambda$49/686728157.run(UnkNown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294)
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/1190035432.run(UnkNown Source)
    at com.sun.glass.ui.invokelaterdispatcher$Future.run(invokelaterdispatcher.java:95)

据我所知,负责的线程处于WAITING状态,我不知道它在等待什么,以及如何结束此等待。

我还尝试了用System.exit(0)代替托盘图标的移除:

    private void exit() {
        Platform.exit();
        System.exit(0);
    }

当图标消失时,此操作就完成了,但根据this question,它看起来似乎很优雅。

有人有线索或替代解决方案吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)