Java Mac状态栏项,但不在驳接上

Java Mac状态栏项,但不在驳接上,java,macos,statusbar,dock,headless,Java,Macos,Statusbar,Dock,Headless,我正试图在Mac上制作一个java应用程序,在状态栏中放置一个图标,但我不想在Mac dock上放置jar图标(在纸上有咖啡杯的那个)。因此,我尝试使用System.setProperty(java.awt.headless,true)技术,但是我不能在SystemTray菜单栏中放入任何内容,因为我得到了HeadlessException。如果有人知道如何解决这个问题,我们将不胜感激。这很容易。。。如果你知道怎么做:) 首先将jar文件包装到mac应用程序包中 或者使用mac开发者工具附带的

我正试图在Mac上制作一个java应用程序,在状态栏中放置一个图标,但我不想在Mac dock上放置jar图标(在纸上有咖啡杯的那个)。因此,我尝试使用System.setProperty(java.awt.headless,true)技术,但是我不能在SystemTray菜单栏中放入任何内容,因为我得到了HeadlessException。如果有人知道如何解决这个问题,我们将不胜感激。

这很容易。。。如果你知道怎么做:)

首先将jar文件包装到mac应用程序包中

  • 或者使用mac开发者工具附带的“jar bundler”应用程序
  • 或者使用-unrelative-jarbundler ant任务
然后进入生成包的内容并打开info.plist。 只需添加LSUIElement属性并将其设置为1。这将在启动时从dock中删除应用程序。 另请参见此处的apple文档:


完整性:还有另一种方法可以做到这一点,但这要痛苦得多。 有一个cocoa命令,允许您动态显示/隐藏停靠图标: 西西莫德(https://developer.apple.com/library/mac/#documentation/Carbon/reference/Dock_Manager/Reference/reference.html) 您可以尝试使用洛可可调用此命令,也可以编写自己的jni库。 或者,我会有一个xcode项目,它在我的github帐户中执行类似的操作—隐藏菜单栏:
您只需更改src/native/jAppleMenuBar.m文件中的一些参数

这避免了码头上的任何东西:

System.setProperty("apple.awt.UIElement", "true");
这将添加托盘图标,如中所示


理想情况下,你希望你的应用程序是一个“UI元素”。对于Cocoa应用程序,这意味着将Info.plist中的
LSUIElement
键设置为1。不知道Java应用程序的“状态栏”是指菜单栏吗?显然,您可以更改dock图标,但我不知道如何通过编程方式删除dock图标。这需要本机Cocoa代码和管理员权限。由于“headlessexception”,我想知道这是否是由于苹果的安全问题(即受感染的网站可能产生无声和恶意Java应用程序)而无法解决的问题。我只是想如果其他应用程序可以做到这一点,并且您可以同时删除这两个应用程序,你可以只删除一个。考虑到安全原因,我觉得这样做是有道理的,他们不会让你两个都删除。非常感谢!这是一个很大的帮助。很酷,但现在作为一个意外的副作用,当我试图启动应用程序时,它已经运行了,它不会启动。当有人再次尝试启动时,是否有办法在最初运行的应用程序中知道?如果他们在应用程序已经运行时双击该应用程序,我想打开UI。可以通过eawt[1]和/或lwawt[2]进行挖掘。这些是和JDKforMac捆绑在一起的osx类(在IDE中禁用禁止引用)。或者看看您是否可以实现nsapplicationelegate[3](例如使用洛可可)链接:[1][2][3]
//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.");
        }