java TrayIcon usando a imagem com fundo transparente
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);
}
}
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.
-
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.
-
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.
-
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.
-
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