【问题标题】:Java app Tray Icon not displaying properly on CentOSJava 应用程序托盘图标无法在 CentOS 上正确显示
【发布时间】:2015-09-04 17:08:03
【问题描述】:

我编写了一个可在 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 时图像会出现上移。

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

【问题讨论】:

    标签: java linux image trayicon


    【解决方案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。我不隶属于该项目。

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      相关资源
      最近更新 更多