如何扩展BufferedImage以创建由多个BufferedImages组成的“动画图像”

时间:2013-11-28 14:01:22

标签: java image swing

我需要创建一个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);
    }
}

1 个答案:

答案 0 :(得分:2)

在我看来,你会发现这个错误,扩展BufferedImage会让你无法通知或显示更改。为了我的钱,我会创建几个ImageIcons并使用Swing Timer在JLabel中交换Icons。


修改
您在评论中说明:

  

为什么不呢?我确信有办法通知或显示更改。无论是通过实现/传递ImageObserver还是其他东西......我都有一个非常庞大的JComponents基础结构,它严重依赖于Image实例。我不能简单地开始使用Icons和JLabel

由于:

  1. 在我看来,对于一个人来说,你的类并不代表与BufferedImage的真正“is-a”关系,BufferedImage是一个为其颜色保存数据缓冲区的具体图像。您尝试的解决方案违反了Liskov替换原则,因为无论您如何构建解决方案,在其他情况下都不可能将新类替换为BufferedImage并使其正常工作。
  2. 您尝试的解决方案深入研究了对Image的子类的低级概念进行根本性更改,当它几乎总是更安全且更容易维护使用更高级别概念的解决方案时。
  3. 你的问题强烈反映为XY-problem。有时 实际上更好地重构代码。