2008-12-01 23 views
21

Windows ve Linux'ta bir tepsi simgesini 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. yerinejava TrayIcon Görüntüyü saydam arka plan kullanarak kullanma

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); 
    } 
} 
+0

Kare bir simgeye geçmek zorunda kalacağım :(:( SystemTray'ı deamon uygulamanız için iyi bir alternatif olarak görebildiğinize memnun oldum. Bu yeni uygulama nedir? bir sır? – OscarRyz

+0

soru, bu simge görüntüsü başka bir yerde görüntülendiğinde opak görünüyor mu? Bir web sayfası örneğin? – OscarRyz

+0

Bu bir sır bir şey ama ben en yakın zamanda açık kaynak kodlu bir proje olarak bunu serbest bırakmayı planlıyorum. Başka bir yerde görüntülendiğinde, görev çubuğum görüntüsünün altında ve kodun üstünde gömülü olduğunu görebiliyorum. – Jack

cevap

2

Bu sorunun çözümü yapılamıyor. 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. Hem saydamlık hem de alfa kanalı gibi saydam renk dizinindeki saydamlık seçeneklerini 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. Başka bir biçim deneyebilirsiniz SVG. Sadece görüntünün saydamlığının sorun olduğundan emin olduktan sonra bunu deneyin (bkz. 1).

bu konuda gerekli bilgi edinmek için buraya bakınız: http://www.rasterman.com/index.php?page=News (2 Şubat 2006 için aşağı kaydırın)

+0

Teşekkür ederiz 1) Transparen t (damalı arka plan) ... Mor yapmaya çalıştım ve tepsinin içinde mor kadar çıktı. 2) GIMP'de kaydederken tüm farklı PNG seçeneklerini denedim ve hepsi aynı sonucu aldılar 3) Aynı zamanda farklı boyut simgelerini denedim (aynı sonuç 4) SVG'yi denedim ... griyi gösterdim. – Jack

+0

Üzgünüz, alan bitti. Fikirler için teşekkürler. Başka fikirlerin var mı? – Jack

+1

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'dan başka bir API var mı?) – ypnos

0

sen (şeffaflık ile) PNG dönüştürerek denediniz:

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

ve test etmek isterseniz ben kullanıyorum görüntü ? Java tarafından daha iyi desteklenme eğilimi gösterdiler (Bu benim deneyimime göre)

+0

Bunu denedim Aynı şey olur .. – Jack

+0

Üzgünüm adam :(ben çıktım –

0

onun 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, temerrütle temayı varsayılan olarak kabul ettiğinizi ve sistem varsayılanını kullanıyor olduğunu bilmiyor

+0

Sadece bu "teoriyi" test ediyorum ve gerçekten de doğrudur – freshfitteds

17

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

Boyamadan önce, simge arka planı, 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(); 
      } 
     } 
    } 
} 

bkz: "gerçek" bir çözüm arayanlar için http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521

10

, ben şeffaflık onurlandıran tepsi simgesini görüntüleme kapasitesine sahip küçük bir kütüphane geliştirdi ve ayrıca (tüm platformlar için) SVG simgeleri kabul eder :

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

Bu bir açık kaynak kütüphane ve kaynak kodu burada bulunabilir edilir:

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

Kitaplık çalışması, linux altında çalışırken JNI alternatifi (GTK ile) sağlayarak sorunu çözer.

+0

Bu GitHub repo'nun 2011'den bu yana çok fazla aktivite yapmadığını fark ettim. Bu hala geçerli bir çözüm mü? Diğer bazı platform tepsisi sorunlarını burada belgeledim: http://stackoverflow.com/a/35919788/3196753. Güvenilir, çapraz platformda çalışan bir çözüme sahip olmak güzel olurdu. – tresf

İlgili konular