Pergunta

Eu estou usando o seguinte código para definir um ícone na bandeja do Windows e Linux. Ele funciona maravilhosa no Windows e funciona bem em Linux. No Linux (Ubuntu) eu tenho o meu conjunto de painel a ser (um pouco) transparente e quando eu adiciono um GIF (com um fundo transparente) o fundo do ícone aparece tudo cinza e feia (ver imagem, diamante verde "!"). ... Todas as ideias sobre como fazer a imagem GIF estou acrescentando "guardar" o seu fundo transparente?

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

e a imagem que estou usando, se você gostaria de testar:

alt texto 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);
  }
}
Foi útil?

Solução

Provavelmente, este problema não pode ser resolvido. Depende de wether Java está fazendo um bom trabalho na criação do subwindow bandeja no Linux ou não. Se Jave não é errado, transparência já está perdida quando a imagem é desenhada.

  1. O que é o valor de fundo real do ícone que você está usando? É o tom de cinza mostrado acima? Configurá-lo para roxo para ver se a transparência da imagem é usada (o padrão Java para fundo cinza) ou não.

  2. Certifique-se de que você tentou ambas as opções de transparência do PNG: índice de cor transparente, bem como alfa canal. Alpha canal é muito comum em Linux, não é assim no mundo Windows.

  3. A resolução do seu ícone é muito pequeno. Fazê-lo em 64x64 ou melhor 128x128. AFAIK não há nenhuma resolução padrão para os ícones da bandeja, e mesmo assim, é certamente não 16x16.

  4. Outro formato que você poderia tentar é SVG. Apenas tentar isso depois de ter certeza que a transparência da imagem é o problema (ver 1).

Veja aqui para informações de fundo sobre esta questão: http://www.rasterman.com/index.php?page=News (rolagem para baixo a 2 de Fevereiro 2006)

Outras dicas

As mentiras problema no método sun.awt.X11.XTrayIconPeer.IconCanvas.paint ()!

Antes de pintar, o fundo ícone é amateurishly apagada, simplesmente desenhando um retângulo de cor de fundo IconCanvas’, para permitir animações de imagem.

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

ver: http://bugs.java.com/bugdatabase/view_bug. Do? bug_id = 6453521

Para aqueles que procuram uma solução "real", eu desenvolvi uma pequena biblioteca que é capaz de exibir a bandeja ícone honrar a transparência e também aceita ícones SVG (para todas as plataformas):

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

É uma biblioteca de código aberto eo código-fonte pode ser encontrada aqui:

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

Os arounds trabalho da biblioteca do problema, fornecendo uma alternativa JNI (com GTK) quando executados no Linux.

JDIC tem um ícone na bandeja, eles podem apoiar a transparência no linux ... https://jdic.dev.java.net/

Você já tentou convertê-lo para um PNG (com transparência) em vez disso? Eu descobri que eles tendem a ser mais bem apoiado por Java (na minha experiência)

não é isso. . . este é happing porque ele está usando o tema GNOME padrão para renderizar a transparência - não tem nada a ver com a imagem que a auto - este é um Adobe AIR / gnome conflito - se você alternar para um tema gnome eram o fundo padrão é cinza, em seguida, seria cinza em vez de branco. Ele usa a imagem padrão do sistema por isso mesmo que foi definido, mas o tema para o painel ter uma imagem BG para torná-lo olhar brilhante como o Vista, por exemplo, do que faria isso. A Adobe Air / Java não sabe que você sobre a estrada o padrão tema com transparência e por isso ele está usando o padrão do sistema

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top