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

时间:2018-11-28 07:58:32

标签: java swing jframe imageicon

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

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

frame.setIconImage

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

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

enter image description here

有什么办法可以解决?

示例代码:

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);
    }

}

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

enter image description here

2 个答案:

答案 0 :(得分:1)

我可以重现问题。

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

替换

f.setIconImage(getIcon());

使用

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

答案 1 :(得分:1)

所提供的代码将继续重复使用相同的BufferedImage。

尝试为每次更新分配一个新的BufferedImage。不必太担心在堆上创建很多废话,它会很快被清除。如果绝对不需要堆上的其他对象,请在两个BufferedImages之间交换。