背景が透明な画像を使用する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);
}
}
解決
この問題は解決できない可能性があります。 Linuxでトレイサブウィンドウを作成する際にJavaがうまく機能しているかどうかに依存します。 Javeが間違っていると、画像の描画時に透明度がすでに失われています。
-
使用しているアイコンの実際の背景値は何ですか?上記の灰色のトーンですか?画像の透明度が使用されるかどうかを確認するには、紫色に設定します(Javaのデフォルトは灰色の背景です)。
-
PNGの透明オプション(透明色インデックスとアルファチャネル)の両方を試したことを確認してください。 Linuxではアルファチャネルが非常に一般的ですが、Windowsの世界ではそうではありません。
-
アイコンの解像度が小さすぎます。 64x64以上の128x128で実行してください。私の知る限り、トレイアイコンの標準解像度はありません。たとえそうであっても、確かに16x16ではありません。
-
試してみることができるもう1つの形式はSVGです。画像の透明度に問題があることを確認してからのみ試してください(1を参照)。
この問題の背景情報については、こちらをご覧ください。 http://www.rasterman.com/index.php?page=News(2006年2月2日までスクロールダウン)
他のヒント
問題は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
「本物」を探している人向け解決策として、透明性を尊重するトレイアイコンを表示できる小さなライブラリを開発し、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でサポートされる傾向があることがわかりました(私の経験では)
それはそうではありません。 。 。これは、透明度をレンダリングするためにデフォルトのGNOMEテーマを使用しているため、これがハッピングしています。これは、画像自体とは関係ありません。これは、Adobe Air / GNOMEの競合です白ではなく灰色になります。システムのデフォルト画像を使用するので、たとえ設定されていても、パネルのテーマにBG画像が含まれていて、それよりもたとえばvistaのように光沢があります。 Adobe Air / Javaは、テーマのデフォルトを透過的に使用していることを認識していないため、システムのデフォルトを使用しています