2008-12-01 15 views
21

estoy usando el siguiente código para establecer un icono de la bandeja de Windows y Linux. Funciona de maravilla en Windows y funciona bien en Linux. En Linux (Ubuntu) tengo mi panel dispuesto a ser (un poco) transparente y cuando agrego un archivo GIF (con un fondo transparente) del fondo del icono aparece todo gris y feo (véase la imagen, diamante verde "!"). ... ¿Alguna idea sobre cómo hacer la imagen GIF? ¿Estoy agregando "mantener" su fondo transparente?TrayIcon java utilizando una imagen con fondo transparente

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

y la imagen que estoy utilizando, si desea probar:

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

Supongo que tendrás que cambiar a un ícono cuadrado :(:( Me complace que encuentres la SystemTray como una buena alternativa para tu aplicación deamon. ¿De qué se trata esta nueva aplicación? :) es ¿una pregunta secreta? – OscarRyz

+0

, esta imagen de icono parece opaca cuando se muestra en otra parte? Una página web por ejemplo? – OscarRyz

+0

Es algo así como un secreto, pero planeo lanzarlo muy probablemente como un proyecto de código abierto muy pronto aquí. La imagen parece bien cuando se muestra en otro lugar. Puede ver que he incrustado debajo de la imagen de mi barra de tareas y sobre el código. – Jack

Respuesta

2

Es probable que este problema no se puede resolver. Depende de si Java está haciendo un buen trabajo al crear la subventana de la bandeja en Linux o no. Si Jave lo hace mal, la transparencia ya se pierde cuando se dibuja la imagen.

  1. ¿Cuál es el valor de fondo real del icono que está utilizando? ¿Es el tono gris que se muestra arriba? Configúrelo en púrpura para ver si se usa la transparencia de la imagen (Java tiene el fondo gris por defecto) o no.

  2. Asegúrese de que ha intentado ambas opciones de transparencia de PNG: índice de color transparente, así como el canal alfa. El canal alfa es muy común en Linux, pero no en el mundo de Windows.

  3. La resolución de su icono es demasiado pequeño. Hazlo en 64x64 o mejor 128x128. AFAIK no hay una resolución estándar para los íconos de la bandeja, e incluso si es así, ciertamente no es 16x16.

  4. Otro formato que podría intentar es SVG. Solo inténtalo después de asegurarte de que la transparencia de la imagen es el problema (ver 1).

Consulte aquí para obtener información de antecedentes sobre este tema: http://www.rasterman.com/index.php?page=News (baje al 2 de febrero de 2006)

+0

Gracias. 1) Es transparen t (fondo a cuadros) ... traté de hacerlo de color púrpura y se vio de color púrpura en la bandeja. 2) Probé todas las diferentes opciones de PNG al guardar en GIMP y todas tuvieron el mismo resultado 3) También probé iconos de diferentes tamaños con el mismo resultado 4) Intenté SVG ... se mostró todo gris. – Jack

+0

Lo siento, se quedó sin espacio. Gracias por las ideas ¿Tiene alguna otra idea? – Jack

+1

Entonces, si Java realmente no entiende la transparencia de la imagen, es realmente extraño. Tal vez intente dibujar una imagen dentro de la aplicación. O tal vez hay opciones específicas para estas imágenes. No sé qué hacer más (quizás otra API disponible que SystemTray?) – ypnos

0

¿Usted ha intentado convertir a un PNG (con transparencia) en lugar ? He encontrado que tienden a ser más compatibles con Java (en mi experiencia)

+0

Lo he intentado. Lo mismo sucede. – Jack

+0

Lo siento hombre :(Estoy fuera. –

0

no es eso. . . esto se happing porque está utilizando el tema por defecto de GNOME para hacer que la transparencia - no tiene nada que ver con la propia imagen - esto es un conflicto de aire/gnome Adobe - si se cambia a un tema GNOME fueron el fondo predeterminado es de color gris a continuación, sería gris en lugar de blanco. Utiliza la imagen predeterminada del sistema, por lo que incluso si está configurada, pero el tema del panel tiene una imagen BG para que se vea brillante, como vista, por ejemplo, de lo que sería. Adobe Air/Java no sabe que sobre la ruta el tema predeterminado con transparencia y por lo tanto está usando el sistema predeterminado

+0

Acabo de probar esta "teoría" y de hecho es cierto – freshfitteds

17

El problema está en el método sun.awt.X11.XTrayIconPeer.IconCanvas.paint()!

Antes de pintar, el icono del fondo se borran amateurishly simplemente dibujando un rectángulo de color de fondo IconCanvas’, para permitir animaciones de imágenes.

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

véase: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521

10

Para aquellos que buscan una solución "real", he desarrollado una pequeña biblioteca que es capaz de mostrar el icono de la bandeja en honor a la transparencia y también acepta iconos SVG (para todas las plataformas) :

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

se trata de una biblioteca de código abierto y el código fuente se puede encontrar aquí:

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

La biblioteca soluciona el problema proporcionando una alternativa JNI (con GTK) cuando se ejecuta en Linux.

+0

Me he dado cuenta de que este repositorio GitHub no ha tenido una gran actividad desde 2011. ¿Sigue siendo una solución viable? He documentado algunos otros problemas de bandeja de plataforma aquí: http://stackoverflow.com/a/35919788/3196753. Sería bueno tener una solución que funcione de manera confiable, multiplataforma. – tresf

Cuestiones relacionadas