Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改Java程序的Dock图标?_Java_Macos_Icons_Dock - Fatal编程技术网

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

如何更改Java程序的Dock图标?,java,macos,icons,dock,Java,Macos,Icons,Dock,如何在Macintosh平台上更改Java程序的Dock图标?我听说过使用苹果的Java库(它在Mac平台上提供了某种额外的支持),但我还没有找到一些实际的例子 虽然我不知道如何在运行时更改它,但您可以在命令行中使用-Xdock:icon选项设置停靠图标,如: >java -Xdock:icon=/path/myIcon.png myApp 有很多关于将java应用程序引入Mac的有用的小信息,您可能有兴趣查看列出的Mac实用程序和工具,以及列出的部署选项(如果您想进入java Web

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

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

 >java -Xdock:icon=/path/myIcon.png myApp
有很多关于将java应用程序引入Mac的有用的小信息,您可能有兴趣查看列出的Mac实用程序和工具,以及列出的部署选项(如果您想进入java Webstart路线,最后一个链接特别有用).

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

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

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

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


就创建.icns文件而言,您可以使用Apple的Icon Composer从图像文件创建.icns文件

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

在创建绑定器的过程中,您可以在.icns扩展名中选择一个图标。这将是您的停靠图标。

适用于Microsoft Windows

setIconImage(new ImageIcon("Football.png").getImage());
适用于Mac OS X

import com.apple.eawt.Application;
Application.getApplication().setDockIconImage(new ImageIcon("Football.png").getImage());
Java 9及更高版本的解决方案 在JDK 9中,诸如Mac OS X com.apple.eawt包中的内部API将不再可访问

见:

此代码可以按原样使用。只需更改图像的路径。


这种为MacOSDock设置图标的新实现方式(在JDK9+中)比以前更好,因为在构建应用程序时不会遇到任何问题。在windows计算机上使用此代码也没有问题。反射,这是不推荐的,因为Java 9也不是必需的。

我已经看到该代码被多次使用。如果我想让程序在多个平台上工作怎么办。。。如果我在Windows或Linux上运行该文件,这不会导致问题吗?@Martin Tuskevicius是的,这只适用于Mac,因此您希望为操作系统提供单独的脚本/发行版(就像Mac一样,您可以将该命令行捆绑在applescript中)。在保持平台无关性的同时,很难满足每个操作系统的需求。你个人有没有尝试过使用苹果库的方法?我曾经下载过它,我做了Application.setDockIcon(图像),但是Dock图标只是一个空白区域。这里有一个用于大多数平台的JWS分布式JAR,并为Mac添加了一个应用程序包(
.dmg
)。请注意,对于OS/X,应该使用.icns作为Dock图标。我是赢家。但从我所看到的Mac上的Dock相当于Win上的任务栏。所以我想知道,也许只需调用
setIconImage(newimageicon(“path/to/icon”).getImage()对于你的JFrame可以解决你的问题吗?是的,但是这个类已经被弃用了。我认为只有公共构造函数和一些方法被弃用了,而不是整个类。如果这个方法也适用于.icns,我会感到惊讶的!因此,我认为
-Xdock:icon
是更好的解决方案。在代码库中,这个代码段应该放在什么地方?当您将菜单栏设置为本机OSX时,它必须发生在任何UI代码之前(例如,在启动程序包装中)。这里类似吗?这对JDK 9+不再有效。请参阅我的答案:@hcix此选项是否仅在Mac OS X版本的Eclipse上可用?我安装了Eclipse for Windows,但没有Mac OS X应用程序包选项。@根据安装Eclipse Delta pack的其中一个答案,Igor将允许您将应用程序导出到任何目标平台。@hcix您以前使用过Delta pack吗?它可以为Mac创建一个.app文件和为windows创建一个.exe安装文件吗?这个项目已经不存在了。如果应用程序可以在Mac和windows上运行呢?如何使两者兼容?然后需要检查操作系统的条件。问题是无法导入
com.apple.eawt.Application,因为它是特定于Mac的。我最终使用了基于的解决方案,但该解决方案似乎是一个非常混乱的解决方案。@TotZam我支持你。我也面临这个问题。让我看看能不能想出别的办法。那太好了!同时,我添加了一个答案,解释了我目前用来让代码在Mac和Windows上运行的方法。
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);
    }
}