You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:50:15