2012-06-28 55 views
10

Tôi đang cố gắng để thiết lập các hình ảnh biểu tượng cho một tập tin Jar:Thiết lập hình ảnh biểu tượng ứng dụng mặc định trong xoay Java trên OS X

setIconImage(new ImageIcon(getClass().getResource("logo.png")).getImage()); 

Khi chạy trong Mac OS X 10.7.4 tôi nhận được lỗi sau :

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 
+0

Hình ảnh nằm ở đâu? Sử dụng 'getResource()' để tải hình ảnh, ví dụ: 'getClass(). GetClassLoader(). GetResource (" logo.png ")' – tenorsax

+0

Lỗi tương tự xuất hiện khi tôi làm điều này. – rhombidodecahedron

+0

Đảm bảo rằng 'URL' được trả về bởi' getResource() 'không phải là null. – tenorsax

Trả lời

23

setIconImage không đặt biểu tượng chiếc bình. Nó sẽ thiết lập biểu tượng cho những gì các cửa sổ thu nhỏ cho rằng JFrame sẽ giống như thế. Biểu tượng jar (điều khiển biểu tượng công cụ tìm kiếm và biểu tượng ứng dụng dock) không thể được đặt trong chính tệp jar. Bạn chỉ nhận được biểu tượng mặc định được cung cấp bởi hệ điều hành. Bạn sẽ cần phải quấn nó bằng cách sử dụng một cái gì đó như JarBundler cho OS X hoặc Launch4J cho Windows.

Bạn có thể đặt biểu tượng đế ứng dụng trong khi ứng dụng của bạn đang chạy, xem com.apple.eawt.Application.setDockIconImage. Mặc dù nó không hoàn hảo, bởi vì khi bạn nhấn đúp vào jar, nó sẽ khởi động trong dock bằng cách sử dụng biểu tượng java chung và chỉ chuyển sang biểu tượng tùy chỉnh của bạn sau khi một thư bị trả lại hoặc hai khi mã java bắt đầu chạy. Ngoài ra, tôi không nghĩ rằng nó sẽ thiết lập biểu tượng dock cho một cái bình mà không chạy (không phải là bạn có thể kéo một tập tin jar vào dock anyway - dường như không làm việc cho tôi).

Dưới đây là một số mã đó chứng tỏ những hình ảnh khác nhau mà bạn có thể thiết lập:

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); 
    } 
} 
+0

Cảm ơn, tôi có thể tải xuống lớp Ứng dụng ở đâu? – rhombidodecahedron

+0

Nó được cài đặt trên mọi máy Mac. –

+2

+1 cho 'com.apple.eawt.Application', mà trước đây tôi đã bỏ qua. – trashgod

6

bạn có thể đặt tập tin .icns của bạn trong thư mục Contents/Resources các gói ứng dụng và tham khảo nó trong tập tin Info.plist của bạn. Ví dụ, một file có tên ApplicationName.icns sẽ được tham chiếu bởi một mục <dict> của mẫu này:

<key>CFBundleIconFile</key> 
<string>ApplicationName.icns</string> 

Một số chi tiết liên quan được đề cập here.

+0

Có cách nào để hoàn thành điều này mà không cần gói nó dưới dạng .app? Chúng tôi đã chọn phát triển công nghệ này trên Java để chúng tôi có thể phân phối một tệp cho tất cả người dùng bất kể nền tảng. – rhombidodecahedron

+0

Bạn có thể phân phối tệp JAR có biểu hiện hoặc sử dụng [tag: java-web-start], nhưng bạn sẽ nhận được biểu tượng chung (khác) cho mỗi. – trashgod

1

như tôi đã trải qua lỗi của bạn có liên quan đến hệ điều hành MacOS jdk mà đã bắt đầu xuất hiện sau khi nâng cấp lên 10.7.4

đi qua this nếu điều này giúp bạn:

6

Chỉ cần thêm giải pháp cuối cùng của tôi cho thêm một biểu tượng MacOSX Dock trong một ứng dụng thuần java:

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); 
    } 
} 

Điều này âm thầm đảm bảo lớp học khả dụng và thực hiện phương thức setDockIconImage(). Hoạt động rất tốt cho tôi và nó không can thiệp vào các nền tảng khác.

+0

Hoặc bạn chỉ có thể kiểm tra xem bạn có đang sử dụng "mac" hay không ... Giả sử ... – rogerdpack

+0

@rogerdpack tất nhiên là một tùy chọn, tuy nhiên việc kiểm tra này đảm bảo rằng 'setDockIconImage()' có thể được thực hiện một cách an toàn. – mvreijn

0

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

Các vấn đề liên quan