在动态更新期间,JFrame 默认图标间歇性地显示在 Windows 任务栏中

JFrame's default icon showing intermittently in Win taskbar during dynamic updates

我正在动态更新 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);
    }

}

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

我可以重现问题。

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

替换

f.setIconImage(getIcon());

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

提供的代码不断重复使用相同的 BufferedImage,即已在使用的那个。

尝试为每次更新分配一个新的 BufferedImage。不要太担心在堆上产生大量垃圾,它会很快被清理干净。如果您绝对不需要堆上的额外对象,请在两个 BufferedImage 之间交换。