![](/img/trans.png)
[英]OS X: set application icon when launching Java/Swing application from shellscript
[英]Setting the default application icon image in Java swing on OS X
我正在嘗試為 Jar 文件設置圖標圖像:
setIconImage(new ImageIcon(getClass().getResource("logo.png")).getImage());
在 Mac OS X 10.7.4 中運行時,出現以下錯誤:
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextGetCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextSetBaseCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextGetCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextSetBaseCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextGetCTM: invalid context 0x0
Jun 28 15:21:40 (my dhcp) java[73383] <Error>: CGContextSetBaseCTM: invalid context 0x0
setIconImage
不設置 jar 圖標。 它將為該JFrame
的最小化窗口設置圖標。 jar 圖標(控制 finder 圖標和 Dock 應用程序圖標)不能在 jar 文件本身中設置。 您只需獲得操作系統提供的默認圖標。 您將需要使用諸如適用於 OS X 的 JarBundler 或適用於 Windows 的Launch4J之類的東西來包裝它。
您可以在應用程序運行時設置應用程序停靠圖標,請參閱com.apple.eawt.Application.setDockIconImage
。 但它並不完美,因為當您雙擊您的 jar 時,它會使用通用 java 圖標在 Dock 中啟動,並且僅在 Java 代碼開始運行時一兩次反彈后切換到您的自定義圖標。 另外,我認為它不會為未運行的 jar 設置停靠圖標(並不是說您無論如何都可以將 jar 文件拖到停靠中 - 似乎對我不起作用)。
以下代碼演示了您可以設置的不同圖像:
import com.apple.eawt.Application;
import javax.swing.*;
class SetIcon extends JFrame {
SetIcon() {
setIconImage(new ImageIcon("doc.png").getImage());
Application.getApplication().setDockIconImage(
new ImageIcon("app.png").getImage());
}
public static void main(String args[]) {
SetIcon s = new SetIcon();
s.setVisible(true);
}
}
只是為了添加我在純 Java 應用程序中添加 MacOSX Dock 圖標的最終解決方案:
public boolean exists(String className)
{
try {
Class.forName( className, false, null );
return true;
}
catch (ClassNotFoundException exception) {
return false;
}
}
public void setIcon( BufferedImage icn )
{
if ( exists( "com.apple.eawt.Application" ) )
{
com.apple.eawt.Application.getApplication().setDockIconImage( icn );
}
}
這會默默地確保類可用並執行setDockIconImage()
方法。 對我來說效果很好,並且不會干擾其他平台。
java -Xdock:icon=/path/myIcon.png myApp
正如我經歷了你的錯誤,它與升級到 10.7.4 后開始出現的 MacOS jdk 相關
如果這對您有幫助,請通過此操作:
Java 9+ 解決方案:
Taskbar.getTaskbar().setIconImage(myImage);
...或者對於仍需要針對 Java 8 進行編譯的項目...
/**
* Use reflection to attempt to set the taskbar icon using Java 9+
*/
public void setTaskbarIcon(Image image) {
try {
Class taskbar = Class.forName("java.awt.Taskbar");
Method getTaskbar = taskbar.getDeclaredMethod("getTaskbar");
Object instance = getTaskbar.invoke(taskbar);
Method setIconImage = instance.getClass().getDeclaredMethod("setIconImage", Image.class);
setIconImage.invoke(instance, image);
} catch (Throwable t) {
t.printStackTrace();
}
}
這仍然受到其他帖子中解釋的限制(例如啟動圖標不正確)以及不使用多維.icns
文件的圖標分辨率的限制,但在許多情況下,這將比通用 Java 圖標更好。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.