简体   繁体   中英

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

I am dynamically updating the icon of a JFrame but in the task bar the default icon (cup of coffee) is showing every few seconds, is there any way to disable it?

First I set a default custom icons:

frame.setIconImage

And then update the icon every 100 ms. Tested in Win 7/8/10 (oracle jdk 8 and 10) - same behaviour.

This is for my audio player to visualise audio waves.

在此处输入图片说明

Any way to fix it?

Sample code:

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

}

Every few seconds it is showing a default icon in the task bar:

在此处输入图片说明

I could reproduce the problem.

I disappeared when I made sure the change of icon is performed in the Event-Dispatch-Thread like this (for Java 8 and higher).

Replace

f.setIconImage(getIcon());

with

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

The code provided keeps reusing the same BufferedImage, the one that's already in use.

Try allocating a new BufferedImage for each update. Don't worry too much about creating lots of crap on the heap, it will get cleaned up quickly. If you absolutely require no extra objects on the heap, swap between two BufferedImages.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM