Soru şeffaf arka plan ile görüntü kullanarak java TrayIcon


Windows ve Linux'ta bir tepsi simgesi ayarlamak için aşağıdaki kodu kullanıyorum. Windows'da harika çalışıyor ve Linux'ta iyi çalışıyor. Linux'ta (Ubuntu) panelimin (biraz) saydam olmasını ve bir GIF eklediğimde (saydam bir arka plan ile) simgenin arka planı gri ve çirkin görünür (bkz. Resim, yeşil elmas "!"). ... GIF görüntüsünü nasıl oluşturacağına dair herhangi bir fikir, şeffaf arka planını "saklıyorum" ekliyorum.

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

ve test etmek isterseniz, kullandığım resim:

alt metin 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);
  }
}

21
2017-12-01 16:49


Menşei


Bir kare simgeye geçmek zorunda kalacağım :( :( SystemTray'ı deamon uygulaman için iyi bir alternatif olarak bulmana sevindim. Bu yeni uygulama neyle ilgili? :) Bu bir sır mı? - OscarRyz
soru, bu simge resmi başka bir yerde görüntülendiğinde opak görünüyor mu? Örneğin bir web sayfası mı? - OscarRyz
Bu biraz bir sır ama ben burayı çok yakında açık kaynak kodlu bir proje olarak serbest bırakmayı planlıyorum. Görüntü başka bir yerde görüntülendiğinde iyi görünüyor. Görev çubuğu resmimin altında ve kodun üstünde yerleştirdiğimi görebilirsiniz. - Jack


Cevaplar:


Şans bu sorunun çözülemez. Java, Linux'taki tepsi alt penceresini oluştururken iyi bir iş yapıyor olsun ya da olmasın. Jave yanlış yaparsa, görüntü çizildiğinde şeffaflık zaten kaybolur.

  1. Kullandığınız simgenin gerçek arka plan değeri nedir? Yukarıda gösterilen gri ton mu? Görüntünün saydamlığının kullanılıp kullanılmadığını görmek için onu mor olarak ayarlayın (Java varsayılanı gri arkaplana döner).

  2. Saydam renk dizininin yanı sıra alfa kanalının saydamlık seçeneklerini de denediğinizden emin olun. Alfa kanalı, Windows dünyasında değil, Linux'ta çok yaygındır.

  3. Simgenizin çözünürlüğü çok küçük. 64x64 veya daha iyi 128x128'de yapın. AFAIK, tepsi ikonları için standart bir çözünürlük yoktur ve bu durumda bile, kesinlikle 16x16 değildir.

  4. Deneyebileceğiniz başka bir format SVG'dir. Sadece görüntünün saydamlığının sorun olduğundan emin olduktan sonra bunu deneyin (bkz. 1).

Bu konuyla ilgili arka plan bilgileri için buraya bakın: http://www.rasterman.com/index.php?page=News (2 Şubat 2006'ya ilerleyin)


2
2017-12-01 18:26



Teşekkürler. 1) Bu şeffaf (damalı arka plan) ... Ben mor yapmaya çalıştım ve tepsiye mor olarak gösterdi. 2) GIMP'de kaydederken tüm farklı PNG seçeneklerini denedim ve hepsi aynı sonucu elde ettiler 3) Aynı zamanda farklı boyut simgeleri denedim. Aynı zamanda 4) SVG'yi denedim ... tüm griyi gösterdim. - Jack
Üzgünüm, alan bitti. Fikirler için teşekkürler. Başka fikirlerin var mı? - Jack
Yani eğer Java görüntünün şeffaflığını gerçekten anlamazsa, bu gerçekten garip. Belki uygulama içinde bir resim çizmeyi deneyin. Ya da belki bu görüntüler için belirli seçenekler vardır. Başka ne yapacağımı bilmiyorum (belki de SystemTray'den başka bir API var mı?) - ypnos
Bir cevap vermediniz, sadece spekülasyon, reddetme. - Kalecser


Sorun, sun.awt.X11.XTrayIconPeer.IconCanvas.paint () yönteminde yatıyor!

Resimden önce, ikon arkaplanları, görüntü animasyonlarına izin vermek için sadece IconCanvas'ın arka plan renginin bir dikdörtgeni çizerek temizlenir.

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

görmek: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521


17
2017-10-07 13:18





"Gerçek" bir çözüm arayanlar için, şeffaflığı onurlandıran tepsi simgesini görüntüleyebilen ve aynı zamanda SVG simgelerini kabul eden küçük bir kütüphane geliştirdim (tüm platformlar için):

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

Açık kaynak kodlu bir kütüphanedir ve kaynak kodu şu adreste bulunabilir:

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

Kütüphane, linux altında çalışırken JNI alternatifi (GTK ile) sağlayarak sorunu çözer.


10
2018-05-24 13:13



Bu GitHub repo'nun 2011'den beri çok fazla aktivite yapmadığını fark ettim. Bu hala geçerli bir çözüm mü? Diğer bazı platform tepsisi sorunlarını burada belgeledim: stackoverflow.com/a/35919788/3196753. Güvenilir, çapraz platformda çalışan bir çözüme sahip olmak güzel olurdu. - tresf
Bazı dil ekosistemlerinde (Erlang, Haskell ve Clojure dünyaları gibi), faaliyetlerin eksikliği ve sorunların açılması, başlangıçta kırılmamış olduğu anlamına gelir. Çevresinde küçülen bir dizi meseleye, ideal olarak sıfır olan kütüphanelere bakıyorum. - Petrus Theron


JDIC'in bir tepsi simgesi var, linux'ta saydamlığı destekleyebilirler ... https://jdic.dev.java.net/


1
2017-12-02 15:57





Bunun yerine bir .PNG'ye (saydamlık) dönüştürmeyi denediniz mi? Java tarafından daha iyi desteklenme eğilimi gösterdiler (deneyimlerime göre)


0
2017-12-01 17:02



Bunu denedim. Aynı şey olur. - Jack
Üzgünüm adam: (ben yokum. - Richard Walton


öyle değil . . . Bu şeffaflık oluşturmak için varsayılan GNOME temasını kullandığından nefret ediyor - görüntü ile kendi başına bir ilgisi yok - bu bir adobe hava / gnome çakışması - eğer bir gnome temasına geçerseniz varsayılan arka plan griydi beyaz yerine gri olurdu. Sistem varsayılan görüntüsünü kullanır, bu şekilde ayarlanmış olsa bile, panelin teması, örneğin görüntüden daha parlak görünmesini sağlamak için panelin bir BG görüntüsüne sahip olmasını sağlar. Adobe Air / Java, tema varsayılanını şeffaflık ile aştığınızı bilmez ve sistem varsayılanını kullanır.


0
2018-04-21 00:12



Ben sadece bu "teoriyi" test ediyorum ve gerçekten doğru - freshfitteds