Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java应用程序托盘图标在CentOS上未正确显示_Java_Linux_Image_Trayicon - Fatal编程技术网

Java应用程序托盘图标在CentOS上未正确显示

Java应用程序托盘图标在CentOS上未正确显示,java,linux,image,trayicon,Java,Linux,Image,Trayicon,我已经编写了一个Java应用程序,可以在Windows和Linux上使用。该应用程序使用TrayIcon。在Windows上,这一点非常有效,但在Linux(CentOS)上,TrayIcon有两个问题:1)我的png图像失去了透明度;2)图像看起来像是上移了(稍后将对此进行详细介绍) 我通过获得托盘图标的大小,然后相应地进行缩放,从而考虑到不同环境的影响。这是我的密码: Dimension trayIconSize = tray.getTrayIconSize(); Image origina

我已经编写了一个Java应用程序,可以在Windows和Linux上使用。该应用程序使用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时图像出现上移

有没有办法保持背景的透明度?另外,对于动态获取适当大小的图标有什么建议吗?

大小

尽管SystemTray.getTrayIconSize()声明“返回托盘图标将在系统托盘中占据的空间大小(以像素为单位)”,但该实现实际上返回一个常量值,具体取决于操作系统

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

但是,这不是Linux的限制。特定于Windows的实现返回16x16的常量维度。但是,尽管大多数Windows系统实际上似乎都保持这种大小,但大量的Linux台式机也配备了各种形状和大小的系统托盘。因此,该方法容易出错,不能依赖

透明度

系统托盘的X11实现中不支持透明度。有关详细信息,请参阅和

备选方案

看一看。它是Apache2.0许可的托盘库,也可以通过Maven/Gradle获得。它支持所有平台上的动态缩放和透明度,还支持AppIndicator。我与这个项目无关

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