首页 > 解决方案 > JFrame 的默认图标在动态更新期间在 Win 任务栏中间歇性显示

问题描述

我正在动态更新 a 的图标,JFrame但在任务栏中,默认图标(一杯咖啡)每隔几秒钟显示一次,有什么方法可以禁用它吗?

首先我设置了一个默认的自定义图标:

frame.setIconImage

然后每 100 毫秒更新一次图标。在 Win 7/8/10(oracle jdk 8 和 10)中测试 - 相同的行为。

这是为了让我的音频播放器可视化音频波。

在此处输入图像描述

有什么办法解决吗?

示例代码:

package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.JFrame;

public class TestFrameIcon {

    static BufferedImage img = new BufferedImage(64, 64, BufferedImage.TYPE_4BYTE_ABGR);
    static Random r = new Random();

    private static BufferedImage getIcon() {
        Graphics g = img.getGraphics();
        g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
        g.fillRect(0, 0, img.getWidth(), img.getHeight());
        g.dispose();
        return img;
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();

        f.setIconImage(getIcon());
        f.setSize(100, 100);
        f.setLocationRelativeTo(null);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        new Thread(() -> {
            while (true) {
                f.setIconImage(getIcon());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                }
            }
        }).start();;
        f.setVisible(true);
    }

}

每隔几秒钟,它会在任务栏中显示一个默认图标:

在此处输入图像描述

标签: javaswingjframeimageicon

解决方案


我可以重现这个问题。

当我确保像这样在 Event-Dispatch-Thread 中执行图标更改时(对于 Java 8 及更高版本),我消失了。

代替

f.setIconImage(getIcon());

SwingUtilities.invokeLater(() -> f.setIconImage(getIcon()));

推荐阅读