gpt4 book ai didi

java - 如何扩展 BufferedImage 以创建由多个 BufferedImage 组成的 "animated image"

转载 作者:行者123 更新时间:2023-11-30 04:08:08 27 4
gpt4 key购买 nike

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

最佳答案

在我看来,您的做法是错误的,扩展 BufferedImage 不会为您提供通知或显示更改的工具。为了我的钱,我会创建几个 ImageIcons 并使用 Swing Timer 交换 JLabel 中的图标。

<小时/>

编辑
您在评论中指出:

Why not? I'm sure there is a way to notify or to display a change. Whether it would be by implementing/passing ImageObserver or something else... I have a very large infrastructure of JComponents that are heavily dependent on Image instances. I can not simply start using Icons and JLabels

因为:

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

关于java - 如何扩展 BufferedImage 以创建由多个 BufferedImage 组成的 "animated image",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20268123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com