我正在尝试在 Mac 上制作一个 java 应用程序,在状态栏中放置一个图标,但我不希望 Mac 底座上的罐子图标(纸上有咖啡杯的那个)。所以我尝试使用 System.setProperty(java.awt.headless, true) 技术,但是我无法在 SystemTray 菜单栏中放置任何内容,因为我得到了 HeadlessException。如果有人知道解决此问题的方法,将不胜感激。
2 回答
这很容易......如果你知道怎么做:)
首先将您的 jar 文件包装在 mac 应用程序包中
- 要么使用 mac 开发人员工具附带的“jar bundler”应用程序
- 或使用 -unrelated- jarbundler ant 任务http://jarbundler.sourceforge.net/
然后进入生成的包的内容并打开 info.plist。只需添加 LSUIElement 属性并将其设置为 1。这会在启动时从 Dock 中删除应用程序。还可以在这里查看苹果文档:http: //developer.apple.com/library/ios/#documentation/general/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html
为了完整性:还有另一种方法可以做到这一点,但更痛苦。有一个可可命令允许您动态显示/隐藏停靠图标:SetSystemUIMode(https://developer.apple.com/library/mac/#documentation/Carbon/reference/Dock_Manager/Reference/reference.html)你可以尝试使用 rococoa 调用此命令或编写自己的 jni lib。或者,我会有一个 xcode 项目,它在我的 github 帐户中执行非常相似的操作 - 隐藏菜单栏:https://github.com/kritzikratzi/jAppleMenuBar/ 你只需要更改 src/native/ 中的一些参数jAppleMenuBar.m 文件。
这避免了码头中的任何事情:
System.setProperty("apple.awt.UIElement", "true");
这会添加托盘图标,如https://docs.oracle.com/javase/tutorial/uiswing/misc/systemtray.html所示
//Check the SystemTray is supported
if (!SystemTray.isSupported()) {
System.out.println("SystemTray is not supported");
return;
}
final PopupMenu popup = new PopupMenu();
final TrayIcon trayIcon =
new TrayIcon(createImage("images/bulb.gif", "tray icon"));
final SystemTray tray = SystemTray.getSystemTray();
// Create a pop-up menu components
MenuItem aboutItem = new MenuItem("About");
CheckboxMenuItem cb1 = new CheckboxMenuItem("Set auto size");
CheckboxMenuItem cb2 = new CheckboxMenuItem("Set tooltip");
Menu displayMenu = new Menu("Display");
MenuItem errorItem = new MenuItem("Error");
MenuItem warningItem = new MenuItem("Warning");
MenuItem infoItem = new MenuItem("Info");
MenuItem noneItem = new MenuItem("None");
MenuItem exitItem = new MenuItem("Exit");
//Add components to pop-up menu
popup.add(aboutItem);
popup.addSeparator();
popup.add(cb1);
popup.add(cb2);
popup.addSeparator();
popup.add(displayMenu);
displayMenu.add(errorItem);
displayMenu.add(warningItem);
displayMenu.add(infoItem);
displayMenu.add(noneItem);
popup.add(exitItem);
trayIcon.setPopupMenu(popup);
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.out.println("TrayIcon could not be added.");
}