如何更改 Java 程序的 Dock 图标?

Posted

技术标签:

【中文标题】如何更改 Java 程序的 Dock 图标?【英文标题】:How do you change the Dock Icon of a Java program? 【发布时间】:2011-08-25 18:11:30 【问题描述】:

如何在 Macintosh 平台上更改 Java 程序的 Dock 图标?我听说过使用 Apple 的 Java 库(它在 Mac 平台上提供了某种额外的支持),但我还没有找到一些实际的例子。

【问题讨论】:

我是个赢家。但据我所知,Mac 上的 Dock 相当于 Win 上的任务栏。所以这让我想知道,也许简单地为您的 JFrame 调用 setIconImage(new ImageIcon("path/to/icon").getImage()); 可以解决您的问题? 【参考方案1】:

虽然我不确定如何在运行时更改它,但您可以在命令行中使用 -Xdock:icon 选项设置 Dock 图标,例如:

 >java -Xdock:icon=/path/myIcon.png myApp

This article 有很多关于将 Java 应用程序引入 Mac 的有用信息,您可能有兴趣查看 here 列出的 Mac 实用程序和工具,以及 here 列出的部署选项(最后一个链接如果你想走 Java Webstart 路线,这特别有用)。

【讨论】:

我已经看到该代码被多次使用。如果我希望程序在多个平台上运行怎么办……如果我在 Windows 或 Linux 上运行该文件会不会导致问题? @Martin Tuskevicius 是的,这仅适用于 Mac,因此您需要为操作系统提供单独的脚本/发行版(例如,对于 Mac,您需要将该命令行捆绑在一个 applescript 中) .在保持与平台无关的同时满足每个操作系统的需求是很困难的。 您是否亲自尝试过使用 Apple 库的方法?我曾经下载过它,然后我做了 Application.setDockIcon(Image) 但 Dock Icon 只是一个空白区域。 这是一个 example,它为大多数平台使用 JWS 分布式 JAR,并为 Mac 添加了一个应用程序包 (.dmg)。 请注意,对于 OS/X,您应该使用 .icns 作为停靠图标。【参考方案2】:

Apple eAWT 提供了Application 类,允许更改应用程序的停靠图标。

import com.apple.eawt.Application;
...
Application application = Application.getApplication();
Image image = Toolkit.getDefaultToolkit().getImage("icon.png");
application.setDockIconImage(image);

【讨论】:

是的,但该类已被弃用。 我认为只有公共构造函数和一些方法已被弃用,而不是整个类。 如果这也适用于 .icns,我会感到惊讶!所以我认为-Xdock:icon 是更好的解决方案。 这个sn-p应该放在代码库中的任何特定位置吗?当您将菜单栏设置为原生 OSX 时,它必须在任何 UI 代码之前发生(例如,在启动器包装器中)。这里是不是类似? 这不再适用于 JDK 9+。看我的回答:Solution for JDK9+【参考方案3】:

Java 9 及更高版本的解决方案

在 JDK 9 中,内部 API(例如 Mac OS X com.apple.eawt 包中的 API)将不再可访问。

见:http://openjdk.java.net/jeps/272

package main;

import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Image;
import java.awt.Taskbar;
import java.awt.Toolkit;
import java.net.URL;

/**
 * author: flohall
 * date: 2019-07-07
 */
public final class Main 

    public static void main (String[] args)

        final JFrame jFrame = new JFrame();

        //loading an image from a file
        final Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
        final URL imageResource = Main.class.getClassLoader().getResource("resources/images/icon.gif");
        final Image image = defaultToolkit.getImage(imageResource);

        //this is new since JDK 9
        final Taskbar taskbar = Taskbar.getTaskbar();

        try 
            //set icon for mac os (and other systems which do support this method)
            taskbar.setIconImage(image);
         catch (final UnsupportedOperationException e) 
            System.out.println("The os does not support: 'taskbar.setIconImage'");
         catch (final SecurityException e) 
            System.out.println("There was a security exception for: 'taskbar.setIconImage'");
        

        //set icon for windows os (and other systems which do support this method)
        jFrame.setIconImage(image);

        //adding something to the window so it does show up
        jFrame.getContentPane().add(new JLabel("Hello World"));

        //some default JFrame things
        jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
        jFrame.pack();
        jFrame.setVisible(true);
    

此代码可以按原样使用。只需更改图像的路径即可。 这种为 mac os dock 设置图标的新实现方式(在 JDK 9+ 中)比以前更好,因为在构建应用程序时不会遇到任何问题。在 Windows 计算机上使用此代码也没有问题。不推荐使用反射,因为 Java 9 也不需要。

【讨论】:

【参考方案4】:

如果您使用 Eclipse,您可以将项目导出为 Mac OS X 应用程序包并指定一个 .icns 文件用作图标。 在 Eclipse 中,转到 File>Export 并选择“Other”目录中的“Mac OS X Application Bundle”选项。

单击下一步按钮。 然后您将看到“应用程序包导出菜单”。 此菜单上的最后一个选项是“图标”。您可以在此处指定要用作停靠图标的 .icns 文件。

Picture of the 2 Eclipse Export Menus

就创建 .icns 文件而言,您可以使用 Apple 的 Icon Composer 从图像文件创建 .icns 文件。 Here is a good tutorial on making mac icons.

【讨论】:

@hcix 此选项是否仅在 Mac OS X 版本的 Eclipse 上可用?我安装了适用于 Windows 的 Eclipse,但没有 Mac OS X 应用程序捆绑选项。 @Igor 根据this question 的答案之一,安装 Eclipse Delta 包将允许您将应用程序导出到任何目标平台。 @hcix 你以前用过 delta pack 吗?它可以为 Mac 创建一个 .app 文件,为 windows 创建一个 .exe 安装文件吗?【参考方案5】:

对于微软视窗

setIconImage(new ImageIcon("Football.png").getImage());

适用于 Mac OS X

import com.apple.eawt.Application;
Application.getApplication().setDockIconImage(new ImageIcon("Football.png").getImage());

【讨论】:

如果应用程序可以在 Mac 和 Windows 上运行呢?你如何使它兼容两者? 那么你需要条件来检查操作系统。 问题是您无法在 Windows 计算机上导入 com.apple.eawt.Application;,因为它是 Mac 特定的。我最终使用了基于 this answer 的解决方案,但该解决方案似乎是一个非常混乱的解决方法。 @TotZam 我和你在一起。我也遇到了这个问题。让我看看我能不能想出别的办法。 那太好了!同时,我添加了一个答案here,解释了我目前用来让代码在 Mac 和 Windows 上运行的方法。【参考方案6】:

如果您安装了 XCode,则可以使用 JarBundler 使用 Jar 文件创建 Mac 应用程序。如果你没有 XCode,你可以使用这个 JarBundler:

http://sourceforge.net/projects/jarbundler/

在创建捆绑程序期间,您可以在 .icns 扩展名中选择一个图标。那将是您的 Dock 图标。

【讨论】:

这个项目不再存在

以上是关于如何更改 Java 程序的 Dock 图标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 wxPython 应用程序中更改 Mac OS X 停靠图标

可可:知道应用程序图标在dock中的位置

带有菜单栏但没有 Dock 图标/切换菜单的 Cocoa 应用程序

OSX 上的 QT:托盘图标 - 图标 Dock 问题

从 Dock 中删除 AppleScript 脚本的图标

将承诺的文件拖放到 Dock 中的应用程序图标上