Frage

Ich bin mit dem folgenden Code einen Tray-Icon in Windows und Linux zu setzen. Es funktioniert wunderbar in Windows und arbeitet in Ordnung in Linux. In Linux (Ubuntu) Ich habe meine Platte (etwas) transparent sein gesetzt, und wenn ich ein GIF (mit transparentem Hintergrund) der Hintergrund der Ikone zeigt sich alles grau und hässlich (siehe Bild, grünen Diamanten „!“). ... Alle Ideen, wie das GIF-Bild machen I „halten“ sein transparenter Hintergrund bin hinzufügen?

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

und das Bild, das ich verwende, wenn Sie testen mögen:

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);
  }
}
War es hilfreich?

Lösung

Die Chancen stehen dieses Problem nicht gelöst werden kann. Es hängt davon ab, ob Java wird bei der Erstellung der Schale Subwindow in Linux oder nicht einen guten Job machen. Wenn Jave tut es falsch, wird die Transparenz schon verloren, wenn das Bild gezogen wird.

  1. Was ist der eigentliche Hintergrundwert des Symbols Sie verwenden? Ist es der Grauton oben gezeigt? Setzen Sie sich auf Purpur, um zu sehen, ob die Transparenz des Bildes verwendet wird (Java standardmäßig auf grauen Hintergrund) oder nicht.

  2. Stellen Sie sicher, dass Sie beiden Transparenzoptionen von PNG versucht: transparenter Farbindex sowie Alpha-Kanal. Alpha-Kanal ist sehr häufig in Linux, nicht so in der Windows-Welt.

  3. Die Auflösung Ihres Symbol ist zu klein. Tun Sie es in 64x64 oder besser 128x128. AFAIK gibt es keine Standard-Auflösung für Tray-Icons, und selbst wenn dem so ist, ist es sicher nicht 16x16.

  4. Ein weiteres Format, das Sie versuchen könnte, ist SVG. Nur versuchen, dass Sie sicher, nachdem Sie, dass die Transparenz des Bildes das Problem (siehe 1).

Sehen Sie hier für Hintergrundinformationen zu diesem Thema: http://www.rasterman.com/index.php?page=News (nach unten scrollen bis 2. Februar 2006)

Andere Tipps

Das Problem liegt in der sun.awt.X11.XTrayIconPeer.IconCanvas.paint () -Methode!

Vor dem Lackieren wird das Symbol Hintergrund dilettantisch gelöscht, indem einfach ein Rechteck von IconCanvas’ Hintergrundfarbe zeichnen, Bildanimationen zu ermöglichen.

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

siehe: http://bugs.java.com/bugdatabase/view_bug. tun? bug_id = 6453521

für die Suche nach einem „richtigen“ Lösung suchen, entwickelte ich eine kleine Bibliothek, die zum Anzeigen des Tray-Icon zu Ehren der Transparenz kann und akzeptiert auch SVG-Icons (für alle Plattformen):

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

Es ist eine Open-Source-Bibliothek und die Quellcode kann hier gefunden werden:

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

Die Bibliothek Arbeitsarounds, das Problem durch eine JNI Alternative bereitstellt (mit GTK), wenn sie unter Linux läuft.

JDIC einen Tray-Icon haben, könnten sie Transparenz in Linux unterstützen ... https://jdic.dev.java.net/

Haben Sie versucht, es zu einem .PNG (mit Transparenz) statt Umwandlung? Ich habe sie dazu neigen, gefunden von Java besser unterstützt werden (nach meiner Erfahrung)

es ist nicht so. . . diese happing ist, weil es das Standard-GNOME-Thema für das Rendern der Transparenz verwendet - es hat nichts mit dem Bild, um es selbst zu tun - das ist eine Adobe AIR / gnome Konflikt - wenn Sie zu einem Gnom Thema wechseln ist der Standard wurde Hintergrund grau dann es würde statt weiß grau. Es verwendet das Bildsystem standardmäßig so, auch wenn er eingestellt wurde, aber das Thema für das Panel ein BG Bild zu haben, um es wie Vista zum Beispiel glänzend aussehen zu lassen, als es das tun würde. Adobe Air / Java weiß nicht, dass Sie über das Thema Straßen Standard mit Transparenz und dafür ist es unter Verwendung des Standard-System

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top