2008-12-01 2 views
21

Я использую следующий код для установки значка в трее в Windows и Linux. Он отлично работает в Windows и хорошо работает в Linux. В Linux (Ubuntu) у меня есть панель, которая будет (в некоторой степени) прозрачной, и когда я добавлю GIF (с прозрачным фоном), фон значка отобразит все серые и уродливые (см. Изображение, зеленый бриллиант «!»). ... Любые идеи о том, как сделать образ GIF, я добавляю «сохранить» свой прозрачный фон?java TrayIcon, используя изображение с прозрачным фоном

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

и изображение я использую, если вы хотите, чтобы тест:

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

Я думаю, вам придется переключиться на квадратную иконку :(:( Я рад, что вы нашли SystemTray в качестве хорошей альтернативы для вашего приложения deamon. Что это за новое приложение? тайна? – OscarRyz 2008-12-01 17:17:34

+0

вопрос, делает ли это изображение значка непрозрачным, когда отображается где-то в другом месте? Например, веб-страница – OscarRyz 2008-12-01 17:18:22

+0

Это немного секрет, но я планирую высвободить его скорее всего как проект с открытым исходным кодом довольно скоро здесь. Изображение выглядит отлично, когда отображается где-нибудь еще. Вы можете видеть, что я встроен под своим изображением на панели задач и над кодом. – Jack 2008-12-01 18:35:45

ответ

2

Скорее всего, эта проблема не может быть решена. Это зависит от того, насколько хорошо Java работает над созданием подзаголовка лотка в Linux или нет. Если Jave делает это неправильно, прозрачность уже теряется при рисовании изображения.

  1. Какова фактическая ценность значка, который вы используете? Это серый оттенок, показанный выше? Установите его на фиолетовый, чтобы увидеть, используется ли прозрачность изображения (по умолчанию используется по умолчанию для Java), или нет.

  2. Убедитесь, что вы использовали оба параметра прозрачности PNG: прозрачный индекс цвета, а также альфа-канал. Альфа-канал очень распространен в Linux, а не в мире Windows.

  3. Разрешение вашей иконы слишком маленькое. Сделайте это в 64x64 или выше 128x128. AFAIK нет стандартного разрешения для значков лотков, и даже если это так, это, конечно, не 16x16.

  4. Другой формат, который вы можете попробовать, это SVG. Попробуйте это только после проверки прозрачности изображения (см. 1).

Смотрите здесь для получения справочной информации по этому вопросу: http://www.rasterman.com/index.php?page=News (прокрутите вниз до 2 февраля 2006 года)

0

Вы пытались превратить ее в .PNG (с прозрачностью), вместо ? Я нашел, что они, как правило, лучше поддерживаются Java (по моему опыту)

+0

Я пробовал это. То же самое происходит – Jack 2008-12-01 17:03:03

+0

Извините, человек :(Я вышел – 2008-12-01 17:55:39

0

его не то. , , это происходит, потому что он использует тему GNOME по умолчанию для рендеринга прозрачности - он не имеет ничего общего с самим изображением - это конфликт между adobe air/gnome - если вы переключитесь на тему gnome, исходный фон был серым, тогда это было бы серое, а не белое. Он использует изображение по умолчанию для системы, даже если оно было настроено, но тема для панели имеет изображение BG, чтобы он выглядел глянцевым, например, Vista, чем он это сделал. Adobe Air/Java не знает, что вы по дороге тему по умолчанию с прозрачностью, и поэтому она использует системные значения по умолчанию

17

Проблема заключается в методе sun.awt.X11.XTrayIconPeer.IconCanvas.paint()!

Перед тем, как рисовать, фон значка дилетантски очищается, просто рисуя прямоугольник цвета фона IconCanvas, чтобы разрешить анимацию изображения.

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

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

10

Для тех, кто ищет «реальное» решение, я разработал небольшую библиотеку, которая способна отображать иконку в трее в честь прозрачности, а также принимает иконки SVG (для всех платформ) :

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

Это библиотека с открытым исходным кодом и исходный код можно найти здесь:

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

Библиотека работает вокруг проблемы, предоставляя альтернативу JNI (с GTK) при работе под Linux.