Pregunta

Estoy usando el siguiente código para configurar un icono de bandeja en Windows y Linux. Funciona de maravilla en Windows y funciona bien en Linux. En Linux (Ubuntu) tengo mi panel configurado para ser (algo) transparente y cuando agrego un GIF (con un fondo transparente) el fondo del ícono se muestra gris y feo (ver imagen, diamante verde "! & Quot; ) .... Cualquier idea sobre cómo hacer la imagen GIF que estoy agregando "mantener" su fondo transparente?

texto alternativo http://unarm.org/stackoverflow/panel_task.jpg

y la imagen que estoy usando, si desea probar:

texto alternativo 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);
  }
}
¿Fue útil?

Solución

Es probable que este problema no se pueda 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? Establézcalo en púrpura para ver si se usa la transparencia de la imagen (el valor predeterminado de Java es el fondo gris) o no.

  2. Asegúrese de haber probado las dos opciones de transparencia de PNG: índice de color transparente y canal alfa. El canal alfa es muy común en Linux, no así en el mundo de Windows.

  3. La resolución de su icono es demasiado pequeña. 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 puedes probar es SVG. Solo intente eso después de asegurarse de que la transparencia de la imagen sea el problema (ver 1).

Consulte aquí para obtener información general sobre este tema: http://www.rasterman.com/index.php?page=News (desplazarse hacia abajo hasta el 2 de febrero de 2006)

Otros consejos

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

Antes de pintar, el fondo del icono se borra de forma amateur simplemente dibujando un rectángulo de IconCanvas & # 8217; color de fondo, 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();
            }
        }
    }
}

ver: http://bugs.java.com/bugdatabase/view_bug. hacer? bug_id = 6453521

Para aquellos que buscan un " real " solución, desarrollé 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-transparencia.html

Es 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 al proporcionar una alternativa JNI (con GTK) cuando se ejecuta en Linux.

JDIC tiene un icono de bandeja, pueden admitir transparencia en Linux ... https://jdic.dev.java.net/

¿Has intentado convertirlo a .PNG (con transparencia)? He descubierto que tienden a ser mejor compatibles con Java (en mi experiencia)

no es eso. . . Esto está sucediendo porque está usando el tema predeterminado de GNOME para representar la transparencia, no tiene nada que ver con la imagen en sí misma, este es un conflicto de adobe air / gnome, si cambias a un tema de gnome donde el fondo predeterminado es gris, entonces sería gris en lugar de blanco. Utiliza la imagen predeterminada del sistema, por lo que incluso si se configuró, pero el tema para que el panel tenga una imagen BG para que se vea brillante como vista, por ejemplo, de lo que lo haría. Adobe Air / Java no sabe que superas el tema predeterminado con transparencia y, por lo tanto, está usando el valor predeterminado del sistema

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top