在动态更新期间,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 之间交换。
我正在动态更新 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 之间交换。