Windows系统下Java通知图标显示异常问题排查
Windows下Java通知Toast图标显示损坏问题分析
问题现象
- 在Windows 10/11系统中,使用各厂商OpenJDK 11至21版本开发时,Java弹出的通知Toast图标显示异常
- 窗口图标、系统托盘图标显示正常,但通知图标表现不一致:Windows 10下仅下半部分损坏,Windows 11下完全损坏
复现代码
package org.example; import java.awt.*; public class Main { public static void main(String[] args) { if (SystemTray.isSupported()) { Dialog d = new Dialog(((Window) null), "Corrupt Icon Demo"); d.setLayout(new BorderLayout()); d.setBounds(0, 0, 750, 500); d.setVisible(true); final Image normalImage = Toolkit.getDefaultToolkit().createImage("./Foo.png"); d.setIconImage(normalImage); final SystemTray tray = SystemTray.getSystemTray(); final TrayIcon trayIcon = new TrayIcon(normalImage, "Corrupt Icon Demo"); trayIcon.setImageAutoSize(true); try { tray.add(trayIcon); } catch (AWTException e) { throw new RuntimeException(e); } trayIcon.displayMessage("Test", "Test", TrayIcon.MessageType.NONE); } } }
问题根源
通过分析OpenJDK的WTrayIconPeer.java源码可以确定:
- 代码中
TRAY_ICON_MASK_SIZE保持固定值,未根据Windows系统的缩放设置动态调整alpha透明位掩码尺寸 - 但图标本身已经按照系统缩放比例做了缩放处理,掩码尺寸与缩放后的图标不匹配,最终导致通知图标显示损坏
结论
这是OpenJDK的实现bug,并非你遗漏了相关配置。目前没有用户侧的简单配置可以修复该问题,可尝试以下临时方案:
- 使用与系统默认缩放比例匹配的图标文件(例如256x256像素的PNG图标),部分场景下可缓解显示异常
- 关注OpenJDK官方对该类问题的修复进度
内容的提问来源于stack exchange,提问作者Alexander Kalinowski
相关产品推荐
相关产品推荐

