Domanda

Sto usando il seguente codice per impostare un'icona nella barra delle applicazioni in Windows e Linux. Funziona meravigliosamente in Windows e funziona bene in Linux. In Linux (Ubuntu) ho il mio pannello impostato per essere (in qualche modo) trasparente e quando aggiungo una GIF (con uno sfondo trasparente) lo sfondo dell'icona mostra tutto grigio e brutto (vedi immagine, diamante verde "! & Quot; ) .... Qualche idea su come realizzare l'immagine GIF che sto aggiungendo " keep " il suo sfondo trasparente?

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

e l'immagine che sto usando, se desideri testare:

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);
  }
}
È stato utile?

Soluzione

È probabile che questo problema non possa essere risolto. Dipende dal fatto che Java stia facendo un buon lavoro nella creazione della sottofinestra del vassoio in Linux o meno. Se Jave fa un errore, la trasparenza è già persa quando l'immagine viene disegnata.

  1. Qual è il valore di sfondo reale dell'icona che stai utilizzando? È il tono grigio mostrato sopra? Impostalo su viola per vedere se viene utilizzata la trasparenza dell'immagine (Java passa automaticamente allo sfondo grigio) oppure no.

  2. Assicurati di aver provato entrambe le opzioni di trasparenza di PNG: indice di colore trasparente e canale alfa. Il canale alfa è molto comune in Linux, non così nel mondo di Windows.

  3. La risoluzione della tua icona è troppo piccola. Fallo in 64x64 o meglio 128x128. AFAIK non esiste una risoluzione standard per le icone della barra delle applicazioni e, anche in questo caso, non è certamente 16x16.

  4. Un altro formato che potresti provare è SVG. Provalo solo dopo esserti assicurato che la trasparenza dell'immagine sia il problema (vedi 1).

Vedi qui per informazioni di base su questo problema: http://www.rasterman.com/index.php?page=News (scorrere fino al 2 febbraio 2006)

Altri suggerimenti

Il problema risiede nel metodo sun.awt.X11.XTrayIconPeer.IconCanvas.paint ()!

Prima di dipingere, lo sfondo dell'icona viene cancellato dilettatamente semplicemente disegnando un rettangolo del colore di sfondo di IconCanvas, per consentire le animazioni dell'immagine.

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

vedi: http://bugs.java.com/bugdatabase/view_bug. fare? bug_id = 6453521

Per coloro che cercano un "reale" soluzione, ho sviluppato una piccola libreria in grado di visualizzare l'icona della barra delle applicazioni in onore della trasparenza e accetta anche le icone SVG (per tutte le piattaforme):

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

È una libreria open source e il codice sorgente può essere trovato qui:

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

La libreria risolve il problema fornendo un'alternativa JNI (con GTK) durante l'esecuzione su Linux.

JDIC ha un'icona nella barra delle applicazioni, potrebbe supportare la trasparenza in Linux ... https://jdic.dev.java.net/

Hai provato a convertirlo in un .PNG (con trasparenza) invece? Ho scoperto che tendono a essere meglio supportati da Java (nella mia esperienza)

non è quello. . . questo è accattivante perché sta usando il tema GNOME predefinito per il rendering della trasparenza - non ha nulla a che fare con l'immagine di per sé - questo è un conflitto di Adobe / air gnome - se si passa a un tema gnome se lo sfondo predefinito è grigio allora sarebbe grigio invece che bianco. Utilizza l'immagine predefinita del sistema, quindi anche se è stata impostata, ma il tema del pannello deve avere un'immagine BG per renderla lucida come Vista, ad esempio di quanto non farebbe. Adobe Air / Java non sa di aver superato il tema predefinito con trasparenza e quindi utilizza il valore predefinito di sistema

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top