我使用以下代码在Windows和Linux中设置托盘图标。它在Windows中运行良好,在Linux中运行正常。在Linux(Ubuntu)中,我的面板设置为(有些)透明,当我添加GIF(具有透明背景)时,图标的背景显示所有灰色和丑陋(参见图像,绿色钻石“!”)。 ...关于如何制作GIF图像的任何想法我都在“保持”其透明背景?
alt text http://unarm.org/stackoverflow/panel_task.jpg
和我正在使用的图像,如果你想测试:
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);
}
}
答案 0 :(得分:17)
问题在于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
答案 1 :(得分:10)
对于那些寻找“真正”解决方案的人,我开发了一个小型库,能够显示托盘图标以表达透明度,并且还接受SVG图标(适用于所有平台):
http://skype2gmail.blogspot.com/2011/05/java-tray-icon-transparency.html
它是一个开源库,源代码可以在这里找到:
https://github.com/taksan/native-tray-adapter
该库通过在linux下运行时提供JNI替代(使用GTK)来解决问题。
答案 2 :(得分:2)
有可能无法解决此问题。这取决于Java是否在Linux中创建托盘子窗口方面做得很好。如果Jave做错了,绘制图像时透明度已经丢失。
您使用的图标的真实背景值是多少?它是上面显示的灰色调吗?将其设置为紫色,以查看是否使用了图像的透明度(Java默认为灰色背景)。
确保您尝试了两种PNG透明度选项:透明色索引以及Alpha通道。 Alpha通道在Linux中很常见,在Windows世界中并非如此。
图标的分辨率太小。在64x64或更好的128x128中执行此操作。 AFAIK托盘图标没有标准分辨率,即使如此,它肯定不是16x16。
您可以尝试的另一种格式是SVG。只有在确保图像的透明度出现问题后才能尝试(参见1)。
有关此问题的背景信息,请参阅此处: http://www.rasterman.com/index.php?page=News(向下滚动到2006年2月2日)
答案 3 :(得分:1)
JDIC有一个托盘图标,它们可能支持linux的透明度...... https://jdic.dev.java.net/
答案 4 :(得分:0)
您是否尝试过将其转换为.PNG(透明度)?我发现它们往往更受Java支持(根据我的经验)
答案 5 :(得分:0)
不是那样的。 。 。这是因为它使用默认的GNOME主题来渲染透明度 - 这与它自己的图像无关 - 这是adobe air / gnome冲突 - 如果你切换到gnome主题,默认背景是灰色然后它会是灰色而不是白色。它使用系统默认图像,所以即使它已经设置,但面板的主题有一个BG图像使其看起来像vista一样光滑,例如它会做到这一点。 Adobe Air / Java不知道您在主题默认情况下使用透明度,因此它使用的是系统默认值