This:
private BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
Instantiates a new BufferedImage
and stores a reference to that object in image
.
This:
zooms.push(image);
Pushes the reference to that single BufferedImage
you created onto the stack.
As long as you keep using the same BufferedImage
, all you are doing is pushing multiple references to the same object onto the stack; so changes to the object's data are reflected in every reference you've placed on the stack, because every item in the stack points to the same object.
The high-level effect is you are changing every previous state to the current one every time you render.
You'll want to create a whole new BufferedImage
for each state; so that each reference you stick on the stack points to a unique object.
Take a look at this nice little article about how references work in Java.