Java TrayIcon za pomocą obrazu z przezroczystym tłem

Używam poniższego kodu, aby ustawić ikonę tray ' a w systemach Windows i Linux. Działa wspaniale w Windows i działa dobrze w Linuksie. W Linuksie (Ubuntu) mam ustawiony panel na (nieco) przezroczysty i kiedy dodam GIF (z przezroczystym tłem) tło ikony pokazuje się cały szary i brzydki (patrz obrazek, zielony diament "!")....Jakieś pomysły, jak zrobić obraz GIF, który dodaję, "zachowaj" jego przezroczyste tło?

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

I obraz, którego używam, jeśli chcesz przetestować:

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);
  }
}
Author: Jack, 2008-12-01

6 answers

Są szanse, że tego problemu nie da się rozwiązać. To zależy od tego, czy Java robi dobrą robotę w tworzeniu subwindowa tray w Linuksie, czy nie. Jeśli Jave zrobi to źle, przezroczystość zostanie utracona podczas rysowania obrazu.

  1. Jaka jest prawdziwa wartość tła używanej ikony? Czy to szary ton pokazany powyżej? Ustaw ją na fioletową, aby sprawdzić, czy używana jest przezroczystość obrazu (domyślnie Java ma szare tło).

  2. Upewnij się, że próbowałeś obu opcje przezroczystości PNG: przezroczysty indeks kolorów oraz kanał alfa. Kanał alfa jest bardzo powszechny w Linuksie, a nie w świecie Windows.

  3. Rozdzielczość ikony jest zbyt mała. Zrób to w 64x64 lub lepiej 128x128. AFAIK nie ma standardowej rozdzielczości dla ikon tray, a nawet jeśli tak, to na pewno nie jest 16x16.

  4. Innym formatem, który możesz wypróbować, jest SVG. Spróbuj tego tylko po upewnieniu się, że przezroczystość obrazu jest problemem (zobacz 1).

Zobacz tutaj, aby uzyskać podstawowe informacje na ten temat: http://www.rasterman.com/index.php?page=News (przewiń w dół do 2 lutego 2006)

 2
Author: ypnos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-01 18:26:03

Problem tkwi w słońcu.awt.X11.XTrayIconPeer.IconCanvas.metoda paint ()!

Przed malowaniem tło ikony jest amatorsko czyszczone, rysując prostokąt koloru tła IconCanvas, aby umożliwić animację obrazu.

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

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

 17
Author: Falkster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-03 17:59:25

Dla tych, którzy szukają "prawdziwego" rozwiązania, opracowałem małą bibliotekę, która jest w stanie wyświetlać ikonę w tray ' u, honorującą przezroczystość, a także akceptuje ikony SVG (dla wszystkich platform):

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

Jest to biblioteka open source, a kod źródłowy można znaleźć tutaj:

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

Praca biblioteki wokół problemu poprzez dostarczenie Alternatywa JNI (z GTK) podczas pracy pod Linuksem.

 10
Author: taksan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-24 13:13:59

JDIC ma ikonę tray ' a, mogą obsługiwać przezroczystość w Linuksie... https://jdic.dev.java.net/

 1
Author: Somatik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-02 15:57:04

Czy próbowałeś przekonwertować go naPNG (z przezroczystością) zamiast? Z mojego doświadczenia wynika, że są one lepiej wspierane przez Javę

 0
Author: Richard Walton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-01 17:02:04

To nie to . . . dzieje się tak, ponieważ używa domyślnego motywu GNOME do renderowania przezroczystości - nie ma to nic wspólnego z obrazem - jest to konflikt adobe air / gnome - jeśli przełączysz się na motyw gnome, gdy domyślne tło jest szare, to będzie szare zamiast białego. Używa domyślnego obrazu systemu, więc nawet jeśli został ustawiony, ale motyw panelu ma obraz BG, aby wyglądał błyszcząco jak vista, na przykład, niż to zrobi. Adobe Air / Java nie wie, że over road the theme default z przezroczystością i dlatego używa domyślnego systemu

 0
Author: freshfitteds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-21 00:12:25