以布赖恩的回答为基础,我能够使用以下代码使用 OS X 特定方法设置 Mac 停靠图标图像。与其他答案不同,此答案包含一个完整的示例,并且没有尝试将对象强制转换为 OS X 特定类对象的问题。
代码的作用:
- 此代码不是导入 OS X 特定库,而是
Class.forName(String)
用于获取Class
与 OS X 特定类关联的对象。在此示例中,该com.apple.eawt.Application
库用于设置停靠图标图像。
- 然后使用反射来调用 OS X 特定类的方法。
getClass()
用于获取Application
对象,getMethod().invoke()
用于调用getApplication()
和setDockIconImage()
方法。
我已经包含了显示通常在 OS X 专有程序中使用的代码的注释,以明确反射代码正在替换什么。(如果您正在创建一个只需要在 Mac 上运行的程序,请参阅如何更改 Java 程序的 Dock 图标?了解设置停靠图标图像所需的代码。)
// Retrieve the Image object from the locally stored image file
// "frame" is the name of my JFrame variable, and "filename" is the name of the image file
Image image = Toolkit.getDefaultToolkit().getImage(frame.getClass().getResource(fileName));
try {
// Replace: import com.apple.eawt.Application
String className = "com.apple.eawt.Application";
Class<?> cls = Class.forName(className);
// Replace: Application application = Application.getApplication();
Object application = cls.newInstance().getClass().getMethod("getApplication")
.invoke(null);
// Replace: application.setDockIconImage(image);
application.getClass().getMethod("setDockIconImage", java.awt.Image.class)
.invoke(application, image);
}
catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException | NoSuchMethodException | SecurityException
| InstantiationException e) {
e.printStackTrace();
}
Although this code works, this method still seems to be a messy workaround, and it would be great if anyone has any other suggestions on how to include OS X specific code in a program used on Mac and Windows.