Libgdx 1.11 macOS Dock图标设置后程序挂起问题求助
解决LibGDX macOS Dock图标设置导致程序挂起的问题
你的问题核心是AWT API与LibGDX渲染线程的线程冲突——LibGDX依赖LWGL运行在专属渲染线程中,直接调用AWT的Taskbar相关操作,会触发AWT事件调度线程(EDT)与LibGDX线程的死锁,最终导致程序挂起。
以下是修正后的实用解决方案:
方案1:将图标设置逻辑移至AWT事件调度线程执行
把设置图标的代码包裹在EventQueue.invokeLater中,确保AWT相关操作在它专属的线程里运行,同时等待图片加载完成再设置:
private static void updateDockIconForMacOs() { if (SharedLibraryLoader.isMac) { // 强制在AWT事件调度线程执行操作 java.awt.EventQueue.invokeLater(() -> { try { Toolkit defaultToolkit = Toolkit.getDefaultToolkit(); final URL imageResource = DesktopLauncher.class.getClassLoader().getResource("icon.png"); if (imageResource == null) { System.err.println("未找到icon.png资源"); return; } final Image image = defaultToolkit.getImage(imageResource); // 等待图片加载完成,避免异步加载引发的未知问题 MediaTracker tracker = new MediaTracker(new java.awt.Component() {}); tracker.addImage(image, 0); tracker.waitForAll(); Taskbar taskbar = Taskbar.getTaskbar(); taskbar.setIconImage(image); } catch (Throwable throwable) { throwable.printStackTrace(); } }); } }
方案2:改用LibGDX原生资源加载(更适配打包场景)
如果getClassLoader().getResource在打包后出现资源找不到的情况,用LibGDX的文件API读取图片再转成AWT Image:
private static void updateDockIconForMacOs() { if (SharedLibraryLoader.isMac) { java.awt.EventQueue.invokeLater(() -> { try { // 用LibGDX加载assets目录下的图标 FileHandle iconFile = Gdx.files.internal("icon.png"); BufferedImage bufferedImage = ImageIO.read(iconFile.read()); Taskbar taskbar = Taskbar.getTaskbar(); taskbar.setIconImage(bufferedImage); } catch (Throwable throwable) { throwable.printStackTrace(); } }); } }
额外注意事项
- 调用时机:建议在LibGDX应用的
create()方法末尾执行updateDockIconForMacOs,确保LibGDX线程环境稳定后再操作。 - 图标规格:macOS Dock图标优先用
.icns格式(可通过工具将PNG转换),PNG格式推荐512x512分辨率,避免显示模糊。
内容的提问来源于stack exchange,提问作者Derek Li
相关产品推荐
相关产品推荐

