我需要创建一个AnimatedImage类,它将获取一个Image对象数组,并在给定时间间隔的情况下以循环方式显示它们。
我们的想法是让Swing组件使用这个AnimatedImage类,就像使用常规BufferedImage来显示图像一样。 AnimatedImage将以循环方式切换实际图像,并通知swing组件显示下一个实际图像。
我的问题是我找不到通知swing组件AnimatedImage切换实际图像的方法。
我希望你能理解我的意思。
任何帮助将不胜感激!
到目前为止我做了什么:
public class AnimatedImage extends BufferedImage
{
private final Image[] images;
private int imageIndex = 0;
public AnimatedImage(Image[] images, int interval)
{
super(images[0].getWidth(null), images[0].getHeight(null), BufferedImage.TYPE_INT_ARGB);
this.images = images;
ActionListener listener = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
iterate();
}
};
Timer timer = new Timer(interval, listener);
timer.start();
}
private void iterate()
{
imageIndex = imageIndex + 1 >= images.length ? 0 : imageIndex + 1;
}
public float getAccelerationPriority()
{
return images[imageIndex].getAccelerationPriority();
}
public ImageCapabilities getCapabilities(GraphicsConfiguration gc)
{
return images[imageIndex].getCapabilities(gc);
}
public Image getScaledInstance(int width, int height, int hints)
{
return images[imageIndex].getScaledInstance(width, height, hints);
}
@Override
public Graphics getGraphics()
{
return images[imageIndex].getGraphics();
}
@Override
public int getHeight(ImageObserver observer)
{
return images[imageIndex].getHeight(observer);
}
@Override
public Object getProperty(String name, ImageObserver observer)
{
return images[imageIndex].getProperty(name, observer);
}
@Override
public ImageProducer getSource()
{
return images[imageIndex].getSource();
}
@Override
public int getWidth(ImageObserver observer)
{
return images[imageIndex].getWidth(observer);
}
}
答案 0 :(得分:2)
在我看来,你会发现这个错误,扩展BufferedImage会让你无法通知或显示更改。为了我的钱,我会创建几个ImageIcons并使用Swing Timer在JLabel中交换Icons。
修改强>
您在评论中说明:
为什么不呢?我确信有办法通知或显示更改。无论是通过实现/传递ImageObserver还是其他东西......我都有一个非常庞大的JComponents基础结构,它严重依赖于Image实例。我不能简单地开始使用Icons和JLabel
由于: