Значок JFrame по умолчанию периодически отображается на панели задач Win во время динамических обновлений - PullRequest
0 голосов
/ 28 ноября 2018

Я динамически обновляю значок 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 голосов
/ 29 ноября 2018

В приведенном коде повторно используется тот же BufferedImage, который уже используется.

Попробуйте выделить новый BufferedImage для каждого обновления.Не беспокойтесь о создании большого количества мусора в куче, он будет быстро очищен.Если вам абсолютно не нужны лишние объекты в куче, поменяйте местами два BufferedImages.

0 голосов
/ 28 ноября 2018

Я мог воспроизвести проблему.

Я исчез, когда убедился, что смена значка выполняется в Event-Dispatch-Thread следующим образом (для Java 8 и выше).

Заменить

f.setIconImage(getIcon());

на

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