我正在动态更新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);
}
}
每隔几秒钟它就会在任务栏中显示一个默认图标:
答案 0 :(得分:1)
我可以重现问题。
当我确定在Event-Dispatch-Thread这样的事件中执行过图标更改时(对于Java 8及更高版本),我消失了。
替换
f.setIconImage(getIcon());
使用
SwingUtilities.invokeLater(() -> f.setIconImage(getIcon()));
答案 1 :(得分:1)
所提供的代码将继续重复使用相同的BufferedImage。
尝试为每次更新分配一个新的BufferedImage。不必太担心在堆上创建很多废话,它会很快被清除。如果绝对不需要堆上的其他对象,请在两个BufferedImages之间交换。