java TrayIcon使用透明背景的图像

我正在使用以下代码在Windows和Linux中设置托盘图标。 它在Windows中工作得很好,在Linux中工作正常。 在Linux(Ubuntu)中,我的面板被设置为(有些)透明,当我添加一个GIF(带有透明背景)时,图标的背景显示出所有的灰色和丑陋(参见图像,绿色菱形“!”)。 …关于如何使GIF图像的任何想法,我添加“保持”其透明背景?

替代文字http://unarm.org/stackoverflow/panel_task.jpg

和我正在使用的图像,如果你想testing:

替代文字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); } } 

Solutions Collecting From Web of "java TrayIcon使用透明背景的图像"

有可能是这个问题无法解决。 这取决于Java是否在Linux中创建托盘子窗口做得很好。 如果Jave做错了,当图像被绘制时,透明度已经失去了。

  1. 什么是您正在使用的图标的真实背景价值? 这是上面显示的灰色吗? 将其设置为紫色,以查看是否使用了图像的透明度(Java默认为灰色背景)。

  2. 确保您尝试了PNG的透明度选项:透明颜色索引以及Alpha通道。 Alpha通道在Linux中非常普遍,而Windows世界则不然。

  3. 你的图标的分辨率太小了。 做到64×64或更好的128×128。 AFAIK没有托盘图标的标准分辨率,即使如此,它肯定不是16×16。

  4. 另一种可以尝试的格式是SVG。 只有在确保图像的透明度是问题之后才能尝试(参见1)。

有关此问题的背景信息,请参见此处: http : //www.rasterman.com/index.php? page =News (向下滚动到2006年2月2日)

问题在于sun.awt.X11.XTrayIconPeer.IconCanvas.paint()方法!

在绘画之前,通过简单地绘制一个IconCanvas的背景颜色的矩形,图标背景被业余清除,以允许图像动画。

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

请参阅: http : //bugs.java.com/bugdatabase/view_bug.do?bug_id=6453521

对于那些寻求“真正的”解决方案的人来说,我开发了一个小型库,能够显示托盘图标以表示透明度,并接受SVG图标(适用于所有平台):

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

这是一个开源的库,源代码可以在这里找到:

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

在Linux下运行时,该库通过提供一个JNI替代方案(使用GTK)来解决这个问题。

JDIC有一个托盘图标,他们可能会支持在linux的透明度… https://jdic.dev.java.net/

你有没有尝试将其转换为.PNG(与透明度),而不是? 我发现他们倾向于更好地支持Java(根据我的经验)

这并不是说 。 。 。 这是因为它使用默认的GNOME主题来渲染透明度 – 它与自己的图像没有任何关系 – 这是一个土坯/ gnome冲突 – 如果切换到gnome主题,默认背景是灰色的这将是灰色,而不是白色。 它使用系统默认的图像,所以即使它被设置,但面板的主题有一个BG图像,使它看起来像vista光泽例如比它会这样做。 Adobe Air / Java不知道你在路上的主题默认透明度,因此它使用系统默认