2008-12-01 18 views
21

Tôi đang sử dụng mã sau để đặt biểu tượng khay trong Windows và Linux. Nó hoạt động tuyệt vời trong Windows và hoạt động tốt trong Linux. Trong Linux (Ubuntu), bảng điều khiển của tôi được đặt trong (phần nào) trong suốt và khi tôi thêm một ảnh GIF (với nền trong suốt), nền của biểu tượng hiển thị tất cả màu xám và xấu (xem ảnh, kim cương xanh "!"). ... Bất kỳ ý tưởng nào về cách tạo hình ảnh GIF tôi đang thêm "giữ" nền trong suốt của nó?java TrayIcon sử dụng hình ảnh với nền trong suốt

alt text http://unarm.org/stackoverflow/panel_task.jpg

và hình ảnh tôi đang sử dụng, nếu bạn muốn kiểm tra:

alt text http://unarm.org/stackoverflow/green_info.gif

import java.awt.*; 
import java.awt.event.*; 

public class TrayFun { 


    static class ShowMessageListener implements ActionListener { 
    TrayIcon trayIcon; 
    String title; 
    String message; 
    TrayIcon.MessageType messageType; 
    ShowMessageListener(
     TrayIcon trayIcon, 
     String title, 
     String message, 
     TrayIcon.MessageType messageType) { 
     this.trayIcon = trayIcon; 
     this.title = title; 
     this.message = message; 
     this.messageType = messageType; 
    } 
    public void actionPerformed(ActionEvent e) { 
     trayIcon.displayMessage(title, message, messageType); 
    } 
    } 

    public static void main(String args[]) { 
    Runnable runner = new Runnable() { 
     public void run() { 
     if (SystemTray.isSupported()) { 
      final SystemTray tray = SystemTray.getSystemTray(); 
      Image image = Toolkit.getDefaultToolkit().getImage("green_info.png"); 
      PopupMenu popup = new PopupMenu(); 
      final TrayIcon trayIcon = new TrayIcon(image, "The Tip Text", popup); 
      trayIcon.setImageAutoSize(true); 

      MenuItem item = new MenuItem("Close"); 
     item.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
      tray.remove(trayIcon); 
      } 
     }); 
      popup.add(item); 
      try { 
      tray.add(trayIcon); 
      } catch (AWTException e) { 
      System.err.println("Can't add to tray"); 
      } 
     } else { 
      System.err.println("Tray unavailable"); 
     } 
     } 
    }; 
    EventQueue.invokeLater(runner); 
    } 
} 
+0

Tôi đoán bạn sẽ phải chuyển sang biểu tượng hình vuông :(:( Tôi rất vui khi bạn tìm thấy SystemTray như một giải pháp thay thế tốt cho ứng dụng deamon của bạn. Ứng dụng mới này là gì? :) – OscarRyz

+0

câu hỏi, hình ảnh biểu tượng này trông mờ đục khi được hiển thị ở một nơi khác? Một trang web chẳng hạn? – OscarRyz

+0

Đó là một phần bí mật nhưng tôi dự định phát hành nó rất có thể là một dự án mã nguồn mở khá sớm tại đây bạn có thể thấy tôi đã nhúng bên dưới hình ảnh thanh tác vụ của tôi và phía trên mã số – Jack

Trả lời

2

Rất có thể vấn đề này không thể giải quyết được. Nó phụ thuộc vào thời tiết Java đang làm một công việc tốt trong việc tạo ra subwindow khay trong Linux hay không. Nếu Jave làm sai, tính minh bạch đã bị mất khi hình ảnh được vẽ.

  1. Giá trị nền thực của biểu tượng bạn đang sử dụng là gì? Có phải tông màu xám được hiển thị ở trên không? Đặt nó thành màu tía để xem tính trong suốt của hình ảnh có được sử dụng hay không (Java mặc định là nền màu xám) hay không.

  2. Đảm bảo bạn đã thử cả hai tùy chọn trong suốt của PNG: chỉ mục màu trong suốt cũng như kênh alpha. Kênh Alpha là rất phổ biến trong Linux, không phải như vậy trong thế giới Windows.

  3. Độ phân giải của biểu tượng quá nhỏ. Làm điều đó trong 64x64 hoặc 128x128 tốt hơn. AFAIK không có độ phân giải tiêu chuẩn cho các biểu tượng khay và thậm chí nếu có, chắc chắn không phải là 16x16.

  4. Một định dạng khác bạn có thể thử là SVG. Chỉ thử rằng sau khi đảm bảo rằng độ trong suốt của hình ảnh là vấn đề (xem 1).

Xem ở đây để biết thông tin cơ bản về vấn đề này: http://www.rasterman.com/index.php?page=News (cuộn xuống đến ngày 02 tháng 2 năm 2006)

+0

Cảm ơn. 1) Nó là transparen t (nền rô) ... Tôi đã cố gắng làm cho nó màu tím và nó xuất hiện như màu tím trong khay. 2) Tôi đã thử tất cả các tùy chọn PNG khác nhau khi lưu trong GIMP và tất cả đều có cùng kết quả 3) Tôi cũng đã thử các biểu tượng kích thước khác nhau với cùng một kết quả 4) Tôi đã thử SVG ... hiển thị tất cả màu xám. – Jack

+0

Rất tiếc, đã hết dung lượng. Cảm ơn những ý tưởng. Bạn có bất kỳ ý tưởng nào khác không? – Jack

+1

Vì vậy, nếu Java không thực sự hiểu tính minh bạch của hình ảnh, điều đó thực sự kỳ lạ. Có lẽ hãy thử vẽ một hình ảnh bên trong ứng dụng. Hoặc có lẽ có các tùy chọn cụ thể cho những hình ảnh này. Tôi không biết phải làm gì khác (có lẽ API khác có sẵn hơn SystemTray?) – ypnos

0

Bạn đã cố gắng chuyển đổi nó vào một PNG (với tính minh bạch) thay vì ? Tôi đã tìm thấy chúng có xu hướng được hỗ trợ tốt hơn bởi Java (Theo kinh nghiệm của tôi)

+0

Tôi đã thử điều đó Điều tương tự xảy ra – Jack

+0

Xin lỗi người đàn ông: (Tôi đang ở ngoài. –

0

không phải của nó. . . Đây là điều hạnh phúc vì nó đang sử dụng chủ đề GNOME mặc định để hiển thị độ trong suốt - nó không liên quan gì đến hình ảnh của nó - đây là một xung đột không khí/gnome - nếu bạn chuyển sang chủ đề gnome thì nền mặc định là màu xám nó sẽ có màu xám thay vì màu trắng. Nó sử dụng hình ảnh mặc định của hệ thống vì vậy ngay cả khi nó được thiết lập nhưng chủ đề cho bảng điều khiển để có một hình ảnh BG để làm cho nó trông bóng như vista ví dụ hơn nó sẽ làm điều đó. Adobe Air/Java không biết rằng bạn trên đường mặc định chủ đề với độ trong suốt và do đó, việc sử dụng hệ thống mặc định

+0

Tôi chỉ thử nghiệm "lý thuyết" này và nó thực sự là đúng – freshfitteds

17

Sự cố nằm trong phương thức sun.awt.X11.XTrayIconPeer.IconCanvas.paint()!

Trước khi vẽ, nền biểu tượng bị xóa nghiệp dư bằng cách vẽ một hình chữ nhật có màu nền của IconCanvas, để cho phép hoạt ảnh hình ảnh.

public void paint(Graphics g) { 
    if (g != null && curW > 0 && curH > 0) { 
     BufferedImage bufImage = new BufferedImage(curW, curH, BufferedImage.TYPE_INT_ARGB); 
     Graphics2D gr = bufImage.createGraphics(); 
     if (gr != null) { 
      try { 
       gr.setColor(getBackground()); 
       gr.fillRect(0, 0, curW, curH); 
       gr.drawImage(image, 0, 0, curW, curH, observer); 
       gr.dispose(); 

       g.drawImage(bufImage, 0, 0, curW, curH, null); 
      } finally { 
       gr.dispose(); 
      } 
     } 
    } 
} 

see: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521

10

Đối với những người tìm kiếm một giải pháp "thực", tôi đã phát triển một thư viện nhỏ đó là khả năng hiển thị biểu tượng trên khay tôn vinh tính minh bạch và cũng chấp nhận biểu tượng SVG (cho tất cả các nền tảng) :

http://skype2gmail.blogspot.com/2011/05/java-tray-icon-transparency.html

Nó là một thư viện mã nguồn mở và mã nguồn có thể được tìm thấy ở đây:

https://github.com/taksan/native-tray-adapter

Thư viện hoạt động xung quanh vấn đề bằng cách cung cấp thay thế JNI (với GTK) khi chạy dưới Linux.

+0

Tôi nhận thấy repo GitHub này không có nhiều hoạt động kể từ năm 2011. Đây có phải là giải pháp khả thi không? Tôi đã ghi lại một số vấn đề về khay nền tảng khác tại đây: http://stackoverflow.com/a/35919788/3196753. Nó sẽ là tốt đẹp để có một giải pháp hoạt động đáng tin cậy, nền tảng chéo. – tresf