23

次のコードを使用して、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);
  }
}
4

6 に答える 6

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

于 2010-10-07T13:18:47.383 に答える
10

「本当の」解決策を探している人のために、透明性を尊重するトレイアイコンを表示でき、SVGアイコンも受け入れる小さなライブラリを開発しました(すべてのプラットフォーム用):

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

これはオープン ソース ライブラリであり、ソース コードは次の場所にあります。

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

このライブラリは、Linux での実行時に JNI の代替 (GTK を使用) を提供することで問題を回避します。

于 2011-05-24T13:13:59.813 に答える
2

この問題は解決できない可能性があります。Java が Linux でトレイ サブウィンドウを適切に作成しているかどうかに依存します。Jave が間違っていると、画像が描画された時点で透明度が失われます。

  1. 使用しているアイコンの実際の背景値は何ですか? 上記のグレートーンでしょうか?画像の透明度が使用されている (Java のデフォルトは灰色の背景) かどうかを確認するには、紫に設定します。

  2. PNG の両方の透過オプションを試したことを確認してください: 透過カラー インデックスとアルファ チャネル。アルファ チャネルは Linux では非常に一般的ですが、Windows の世界ではそうではありません。

  3. アイコンの解像度が小さすぎます。64x64 以上の 128x128 で行います。私の知る限り、トレイ アイコンの標準解像度はありません。

  4. 試すことができる別の形式は SVG です。画像の透明度が問題であることを確認してから試してください (1 を参照)。

この問題の背景情報については、 http ://www.rasterman.com/index.php?page=News (2006 年 2 月 2 日までスクロール) を参照してください。

于 2008-12-01T18:26:03.643 に答える
1

JDICにはトレイアイコンがあり、Linuxで透過性をサポートしている可能性があります... https://jdic.dev.java.net/

于 2008-12-02T15:57:04.067 に答える
0

代わりに .PNG (透過性あり) に変換してみましたか? 私は、それらがJavaによってよりよくサポートされる傾向があることを発見しました(私の経験では)

于 2008-12-01T17:02:04.577 に答える
0

そうではありませんが 。. . これは、透明度をレンダリングするためにデフォルトの GNOME テーマを使用しているため、問題が発生しています - それ自体の画像とは関係ありません - これは adobe air / gnome の競合です - gnome テーマに切り替えた場合、デフォルトの背景はグレーです。白ではなくグレーになります。システムのデフォルト画像を使用するため、設定されていても、パネルのテーマにBG画像を使用して、たとえばVistaのように光沢のあるものにします。Adobe Air / Java は、テーマのデフォルトを透過性でオーバーロードしていることを認識しないため、システムのデフォルトを使用しています

于 2010-04-21T00:12:25.727 に答える