Java应用程序托盘图标无法在CentOS上正常显示

时间:2015-06-18 21:11:24

标签: java linux image trayicon

我已经编写了一个可以在Windows和Linux上使用的Java应用程序。该应用程序使用TrayIcon。在Windows上,这非常有效,但在Linux(CentOS)上,TrayIcon有两个问题:1)我的png图像中的透明度已经丢失了)2)图像看起来像是向上移动了(稍后会更多) )。

我通过获取托盘图标大小然后相应地缩放来考虑不同的环境。这是我的代码:

Dimension trayIconSize = tray.getTrayIconSize();
Image originalImage = toolkit.getImage("tray_icon.png");
Image scaledImage = originalImage.getScaledInstance(trayIconSize.width, trayIconSize.height, Image.SCALE_SMOOTH);
trayIcon = new TrayIcon(scaledImage, "Some Text");

在CentOS上,.getTrayIconSize()的返回维度是24x24,但经过测试,它实际上适合24x32(WxH)图像,这可以解释当图像设置为24x24时向上移动的图像。

有没有办法保持背景透明度?另外,有关动态获取正确尺寸图标的任何建议吗?

1 个答案:

答案 0 :(得分:1)

<强>尺寸

虽然documentation表示SystemTray.getTrayIconSize()“返回托盘图标将占用系统托盘的空间的大小(以像素为单位)”,但实现实际上会返回一个常量值,具体取决于操作系统。

这是XSystemTrayPeer.java中方法的实际实现(Oracle JRE 1.8,OpenJDK类似):

public Dimension getTrayIconSize() {
    return new Dimension(24, 24);
}

然而,这不是Linux限制。 Windows特定实现返回16x16的常量维度。但是,虽然大多数Windows系统实际上似乎都坚持这么大,但是大量的Linux桌面还配备了各种形状和大小的同样大量的系统托盘。因此,该方法容易出错,无法依赖。

<强>透明度

系统托盘的X11实施不支持透明度。有关详细信息,请参阅this answerthis bug report

<强>替代

看看dorkbox/SystemTray。它是一个Apache 2.0许可的托盘库,也可以通过Maven / Gradle获得。它支持所有平台上的动态扩展和透明度,并且还支持AppIndicator。我不参与该项目。