Question

J'utilise le code suivant pour définir une icône de barre d'état sous Windows et Linux. Cela fonctionne à merveille sous Windows et sous Linux. Sous Linux (Ubuntu), mon panneau est configuré pour être (quelque peu) transparent et lorsque j’ajoute un GIF (avec un arrière-plan transparent), l’arrière-plan de l’icône apparaît tout en gris et moche (voir image, diamant vert "!"). ) .... Toutes les idées sur la création de l’image GIF que j’ajoute "Conserver" son fond transparent?

texte de remplacement http://unarm.org/stackoverflow/panel_task.jpg

et l'image que j'utilise, si vous souhaitez tester:

texte de remplacement 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);
  }
}
Était-ce utile?

La solution

Il est fort probable que ce problème ne puisse pas être résolu. Cela dépend si Java fait un bon travail en créant la sous-fenêtre tray sous Linux ou non. Si Jave se trompe, la transparence est déjà perdue lorsque l'image est dessinée.

  1. Quelle est la valeur d'arrière-plan réelle de l'icône que vous utilisez? Est-ce le ton gris indiqué ci-dessus? Définissez-la en violet pour voir si la transparence de l'image est utilisée (Java est défini par défaut sur fond gris) ou non.

  2. Assurez-vous d’avoir essayé les deux options de transparence de PNG: index de couleurs transparentes et canal alpha. Le canal alpha est très courant sous Linux, mais pas dans le monde Windows.

  3. La résolution de votre icône est trop petite. Faites-le en 64x64 ou mieux 128x128. Autant que je sache, il n’existe pas de résolution standard pour les icônes de bac et même si c’est le cas, ce n’est certainement pas du 16x16.

  4. Un autre format que vous pouvez essayer est SVG. Essayez uniquement après avoir vérifié que la transparence de l'image pose problème (voir 1).

Voir ici pour des informations générales sur ce problème: http://www.rasterman.com/index.php?page=News (jusqu'au 2 février 2006)

Autres conseils

Le problème réside dans la méthode sun.awt.X11.XTrayIconPeer.IconCanvas.paint ()!

Avant de peindre, l’arrière-plan de l'icône est effacé de façon amateur en dessinant simplement un rectangle d'IconCanvas & # 8217; couleur d'arrière-plan, pour autoriser les animations d'image.

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

voir: http://bugs.java.com/bugdatabase/view_bug. bug_id = 6453521

Pour ceux qui recherchent un "réel" J'ai développé une petite bibliothèque capable d'afficher l'icône de la barre d'état respectant la transparence et acceptant également les icônes SVG (pour toutes les plateformes):

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

C’est une bibliothèque open source et le code source se trouve ici:

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

La bibliothèque résout le problème en fournissant une alternative JNI (avec GTK) lors de l'exécution sous linux.

JDIC a une icône de barre des tâches, ils pourraient prendre en charge la transparence sous Linux ... https://jdic.dev.java.net/

Avez-vous essayé de le convertir en fichier .PNG (avec transparence) à la place? J'ai trouvé qu'ils avaient tendance à être mieux supportés par Java (d'après mon expérience)

ce n'est pas ça. . . cela se produit car il utilise le thème par défaut de GNOME pour le rendu de la transparence - cela n'a rien à voir avec l'image elle-même - il s'agit d'un conflit adobe air / gnome - si vous passez à un thème de gnome où l'arrière-plan par défaut est gris ce serait gris au lieu de blanc. Il utilise l'image par défaut du système, donc même si elle était définie, mais le thème du panneau consistait à avoir une image de glycémie afin de lui donner un aspect brillant, comme vista, par exemple. Adobe Air / Java ignore que vous avez dépassé le thème par défaut avec la transparence et utilise donc le paramètre par défaut du système

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top