java TrayIcon 使用具有透明背景的图像
题
我使用以下代码在 Windows 和 Linux 中设置托盘图标。它在 Windows 中运行良好,在 Linux 中运行良好。在 Linux (Ubuntu) 中,我将面板设置为(某种程度上)透明,当我添加 GIF(具有透明背景)时,图标的背景显示为灰色且丑陋(参见图像,绿色菱形“!”)。 ...关于如何使我添加的 GIF 图像“保持”其透明背景有什么想法吗?
替代文本 http://unarm.org/stackoverflow/panel_task.jpg
如果您想测试的话,我正在使用的图像:
替代文本 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);
}
}
解决方案
这个问题很可能无法解决。这取决于 Java 在 Linux 中创建托盘子窗口是否做得很好。如果 Jave 做错了,那么在绘制图像时透明度就已经丢失了。
您正在使用的图标的真实背景值是多少?是上图的灰色调吗?设置为紫色,看看是否使用了图像的透明度(Java默认为灰色背景)。
确保您尝试了 PNG 的两种透明度选项:透明颜色索引以及 Alpha 通道。Alpha 通道在 Linux 中很常见,但在 Windows 世界中则不然。
你的图标分辨率太小了。以 64x64 或更好的 128x128 格式进行。AFAIK 托盘图标没有标准分辨率,即使有,也肯定不是 16x16。
您可以尝试的另一种格式是 SVG。仅在确定问题出在图像透明度之后再尝试(参见 1)。
有关此问题的背景信息请参阅此处:http://www.rasterman.com/index.php?page=新闻 (向下滚动至 2006 年 2 月 2 日)
其他提示
在问题出在sun.awt.X11.XTrayIconPeer.IconCanvas.paint()方法!
画之前,图标背景amateurishly通过简单地绘制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。办?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来更好的支持(在我的经验)
它不是。 。 。这是happing,因为它使用的是默认的GNOME主题渲染的透明度 - 它无关的图像它的自我 - 这是Adobe空气/ GNOME冲突 - 如果您切换到一个侏儒主题是默认的背景为灰色,然后这将是灰色的,而不是白色。它使用系统默认的图像,即使它被设置但是对于面板的主题有一个背景图片,使它看起来有光泽喜欢Vista例如比它会做到这一点。 Adobe空气/ Java不知道你在路上主题默认透明,它使用的是系统默认为此