在Mac Os中使用Java创建系统托盘(菜单额外选项)图标

15

我正在使用Java开发桌面应用程序。我想在系统托盘(Mac Os中称为菜单扩展)上放置一个带有上下文菜单的图标。Java 6支持在Windows和Linux中实现这一点,但在Mac Os中无法正常工作。

我见过一些应用程序在所有三个操作系统中实现了我想要的功能(例如DropBox),但我不知道它们是否是用Java制作的。

我该如何实现这个功能?

如果Java无法实现,是否有其他跨平台语言可以实现?

谢谢。


1
我在去年内见过这个在OS X 10.5上使用Java的工作。请展示你失败的代码。 - Thorbjørn Ravn Andersen
很遗憾,我现在无法访问我的代码,但如果需要的话,我可以稍后粘贴它。它非常类似(或相等)于这个例子:http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/systemtray/ 问题是SystemTray.isSupported()返回true,没有抛出异常,但是没有图标:( - sinuhepop
2个回答

18

AWT / Swing

根据文档,OS X 10.5更新1及更高版本支持使用TrayIcon

在Mac OS X上,托盘图标使用NSStatusMenus表示,并显示在标准系统菜单附件的左侧。托盘图标的java.awt.Image艺术品按照Mac OS X标准以灰度呈现在菜单附件中。

TrayIcon.displayMessage()将在托盘图标下方放置一个小型非模态对话框。仅当在非模态对话框上按下“OK”按钮时,托盘图标的ActionListener才会被触发,而关闭窗口按钮不会触发它。

多次调用TrayIcon.displayMessage()将解除以前的消息并仅保留最后一条消息。如果应用程序在调用TrayIcon.displayMessage()时不在前台,则应用程序在Dock中弹出其图标。消息窗口带有应用程序的图标,以标识触发通知的应用程序。

noah提供了此示例:

java.awt.SystemTray.getSystemTray().add(new java.awt.TrayIcon(java.awt.Toolkit.getDefaultToolkit().getImage("foo.png")));

请注意,在将图标添加到系统托盘之前,您可能需要将菜单附加到该图标。

SWT

根据文档,SWT 3.3及更高版本支持在OSX上使用TrayItem图标。

放置在系统托盘中的图标现在会在OS X中出现在状态栏中。 SWT TrayItem

这个片段展示了如何创建一个菜单和图标,并将它们放在托盘中。


1
这在Snow Leopard上对我有效:java.awt.SystemTray.getSystemTray().add(new java.awt.TrayIcon(java.awt.Toolkit.getDefaultToolkit().getImage("foo.png"))); - noah
@noah:哎呀,是的,我应该放一个例子。 - Powerlord
谢谢,我会晚些时候在家里尝试。我看不出我的代码有什么大的区别,也许只是个小问题。我不能使用SWT,但我会同样尝试。谢谢。 - sinuhepop
代码片段现在位于Eclipse的git仓库中。 - BrezzaP

1
我将一个Windows应用程序移植到我的Mac上,遇到了一些小困难。我注意到一个问题是图标是全彩色的(不按照Mac的习惯来做)。我需要添加一些OS特定的代码来进行转换。但这比之前Java的早期版本依赖于DLL的桌面集成版本要好很多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接