首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java TrayIcon使用具有透明背景的图像

java TrayIcon使用具有透明背景的图像
EN

Stack Overflow用户
提问于 2008-12-01 16:49:34
回答 6查看 15.7K关注 0票数 23

我使用下面的代码在Windows和Linux中设置一个托盘图标。它在Windows上运行得很好,在Linux上也运行得很好。在Linux (Ubuntu)我有我的面板设置为(有些)透明,当我添加一个GIF (与透明背景)的图标背景显示所有灰色和丑陋(见图片,绿色菱形"!")....Any想法如何使我添加的GIF图像“保持”其透明背景?

alt text http://unarm.org/stackoverflow/panel_task.jpg

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

alt text http://unarm.org/stackoverflow/green_info.gif

代码语言:javascript
复制
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);
  }
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-12-01 18:26:04

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

  1. 你正在使用的图标的真实背景值是多少?是上面显示的灰色色调吗?
  2. 确保你尝试了PNG的两个透明度选项:透明颜色索引以及alpha通道。Alpha通道在Linux中很常见,在Windows世界中就不是这样了。
  3. 你图标的分辨率太小了。在64x64或更好的128x128中执行此操作。AFAIK托盘图标没有标准分辨率,即使有,也肯定不是16x16。
  4. 另一种你可以尝试的格式是SVG。只有在确保图像的透明度是问题所在之后才能尝试(请参见1)。

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

票数 2
EN

Stack Overflow用户

发布于 2010-10-07 21:18:47

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

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

代码语言:javascript
复制
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

票数 17
EN

Stack Overflow用户

发布于 2011-05-24 21:14:00

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

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

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

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

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/331407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档