3

有没有办法在 JFrame 和 Windows 任务栏上使用不同的图标?

当我设置 JFrame.setIconImage(img) 时,这个相同的图像用作 Windows 图标。我可以对 JFrame 和 Windows 任务栏使用不同的图标吗?

4

3 回答 3

8

这项工作在运行标准 Java 7 的 Windows 7 中:

List<Image> icons = new ArrayList<Image>();
icons.add(new ImageIcon("16.png").getImage());
icons.add(new ImageIcon("32.png").getImage());
f.setIconImages(icons);

图标必须正好是16x16 和 32x32。

于 2013-02-21T15:02:14.383 回答
3

您可以使用 setIconImages() 提供不同大小的图标列表。JRE 将为每次使用选择最佳可用尺寸(因此,当图标以较大尺寸显示时,可以显示更详细的版本)。

AFAIK 没有计划的方式来显示特定用途的不同图标。

您可以使用 setUndecorated(true) 并自己渲染窗户装饰,但要使其按预期工作并非易事(由于外观和感觉)。一个 hacky 解决方案可能是通过窗口对等组件(在运行时使用 JDK 源 + 反射)找到您的方式,并为一个或另一个对等组件提供不同的图标。同样,这可能需要特定于活动 L&F 的代码。

于 2013-02-21T14:57:34.923 回答
2

我无法使用建议的解决方案,因为我有 jdk 1.5 作为要求...

所以,我这样做了:

public void setAppIcons(JFrame frame) {
    List<Image> images = new ArrayList<Image>();
    images.add(getImage(MessageUtils.getString("application.images.icon.app.32")).getImage());
    images.add(getImage(MessageUtils.getString("application.images.icon.app.16")).getImage());

    try {
        Class<?> [] types = {java.util.List.class};
        Method method = Class.forName("java.awt.Window").getDeclaredMethod("setIconImages", types);

        Object [] parameters = {images};
        method.invoke(frame, parameters);
    } catch (Exception e) {
        frame.setIconImage(images.get(0));
    }       
}

如果客户端在 jre 1.6 或major 中运行应用程序,应用程序将选择要设置的图像列表...

谢谢你的建议。

于 2013-02-21T18:08:27.220 回答