java TrayIcon使用透明背景图像

java TrayIcon使用透明背景图像,java,linux,panel,gnome,tray,Java,Linux,Panel,Gnome,Tray,我使用以下代码在Windows和Linux中设置托盘图标。它在Windows中工作得很好,在Linux中工作得很好。在Linux(Ubuntu)中,我将我的面板设置为(某种程度上)透明,当我添加GIF(背景透明)时,图标的背景显示为灰色和难看(请参见图像,绿色菱形“!”)……关于如何使我添加的GIF图像“保持”其透明背景的想法 我使用的图像,如果你想测试: 您是否尝试过将其转换为.PNG(具有透明度)?我发现Java往往更好地支持它们(以我的经验)这个问题很可能无法解决。这取决于Java在L

我使用以下代码在Windows和Linux中设置托盘图标。它在Windows中工作得很好,在Linux中工作得很好。在Linux(Ubuntu)中,我将我的面板设置为(某种程度上)透明,当我添加GIF(背景透明)时,图标的背景显示为灰色和难看(请参见图像,绿色菱形“!”)……关于如何使我添加的GIF图像“保持”其透明背景的想法

我使用的图像,如果你想测试:


您是否尝试过将其转换为.PNG(具有透明度)?我发现Java往往更好地支持它们(以我的经验)

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

  • 您正在使用的图标的真实背景值是多少?是上面显示的灰色调吗?将其设置为紫色,以查看是否使用了图像的透明度(Java默认为灰色背景)

  • 确保您尝试了PNG的透明度选项:透明颜色索引和alpha通道。Alpha通道在Linux中非常常见,而在Windows世界中则不常见

  • 图标的分辨率太小。在64x64或更好的128x128中执行此操作。AFAIK没有托盘图标的标准分辨率,即使如此,也肯定不是16x16

  • 您可以尝试的另一种格式是SVG。只有在确定图像的透明度是问题所在后才能尝试(请参见1)

  • 有关此问题的背景信息,请参见此处:
    (向下滚动至2006年2月2日)

    JDIC有一个托盘图标,它们可能支持linux中的透明度。。。
    这不是。这是因为它使用默认GNOME主题渲染透明度-它与图像本身无关-这是adobe air/GNOME冲突-如果切换到GNOME主题,则默认背景为灰色,则它将为灰色而不是白色。它使用系统默认图像,因此即使已设置,但面板的主题也应具有BG图像,以使其看起来像vista一样有光泽,例如,它不会这样做。AdobeAIR/Java不知道您使用了透明的默认主题,因此它使用的是系统默认设置。问题在于sun.awt.X11.XTrayIconPeer.IconCanvas.paint()方法

    在绘制之前,只需绘制一个图标背景颜色的矩形,即可业余地清除图标背景,以允许图像动画

    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();
                }
            }
        }
    }
    
    请参阅:

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

    它是一个开源库,源代码可在以下位置找到:


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

    我想您必须切换到方形图标:(:(我很高兴您发现SystemTray是deamon应用程序的一个很好的替代方案。这个新应用程序是关于什么的?:)这是一个秘密吗?问题,这个图标图像在其他地方显示时看起来不透明吗?比如一个网页?这有点秘密,但我计划很快将其作为一个开源项目发布。在其他地方显示时,图像看起来很好。你可以看到我已经嵌入了我的任务栏图像下方和代码上方。谢谢。1)它是透明的(格子背景)…我试着把它变成紫色,结果它在托盘中显示为紫色。2) 在GIMP中保存时,我尝试了所有不同的PNG选项,它们都有相同的结果3)我还尝试了不同大小的图标,结果相同4)我尝试了SVG…显示为灰色。抱歉,空间不足。谢谢你的建议。你有其他想法吗?所以如果Java真的不理解图像的透明度,那真的很奇怪。也许可以尝试在应用程序内部绘制图像。或者这些图像可能有特定的选项。我不知道还能做什么(也许除了SystemTray之外还有其他可用的API?)我只是测试了这个“理论”,事实上我已经注意到这个GitHub回购自2011年以来没有过大量的活动。这仍然是一个可行的解决方案吗?我在这里记录了一些其他平台托盘问题:。如果有一个跨平台、可靠运行的解决方案就好了。在一些语言生态系统(如Erlang、Haskell和Clojure世界)中,缺乏活动性和开放性问题意味着它一开始就没有被破坏。我寻找那些问题数量不断减少的图书馆,理想情况下为零。
    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();
                }
            }
        }
    }