Copyright Derek O'Reilly, Dundalk Institute of Technology (DkIT), Dundalk, Co. Louth, Ireland.
If more than one image is being manipulated in an applet, then the various images can be held in an ArrayList. This is shown in the example below.
ArrayList_Images_Demo Example: (Run Applet)
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
public class ArrayList_Images_Demo extends JApplet
{
@Override
public void init()
{
this.setContentPane(new View());
}
public class View extends JPanel implements ListSelectionListener
{
private ArrayList<Sprite> imageList = new ArrayList<>();
private ImageCanvas imageCanvas = new ImageCanvas();
private JPanel controls = new JPanel();
private JPanel controlsAndColours = new JPanel();
private String names[] =
{
"koala", "dancers", "smiley", "champions_league"
};
private JList imageChoice = new JList(this.names);
public View()
{
this.imageCanvas.setBackground(Color.white);
// controls Panel
this.controls.setLayout(new FlowLayout());
this.controls.add(this.imageChoice);
// this.controlsAndColours
this.controlsAndColours.setLayout(new BorderLayout());
this.controlsAndColours.add("Center", this.controls);
// Applet's Panel
setLayout(new BorderLayout());
add("Center", this.imageCanvas);
add("South", this.controlsAndColours);
this.imageChoice.addListSelectionListener(this);
}
@Override
public void valueChanged(ListSelectionEvent e)
{
if (e.getValueIsAdjusting())
{
// Value is still changing
// We should wait until it has changed
return;
}
String selectedImage;
selectedImage = this.names[this.imageChoice.getSelectedIndex()];
Image img = new ImageIcon(getClass().getClassLoader().getResource("images/" + selectedImage + ".jpg")).getImage();
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(img, 1);
try
{
tracker.waitForAll();
this.imageList.add(new Sprite(img)); // the identity of the added image. This information is used by deleteImages
}
catch (InterruptedException interruptedException)
{
// do not show the image
}
this.imageCanvas.paintList(this.imageList);
}
}
// ImageCanvas
public class ImageCanvas extends JPanel implements MouseListener, MouseMotionListener
{
private ArrayList<Sprite> imageList = null;
private int selectedImage = -1; // the currently selected image
public ImageCanvas()
{
super();
this.addMouseListener(this);
this.addMouseMotionListener(this);
}
@Override
public void mousePressed(MouseEvent e)
{
for (int i = this.imageList.size() - 1; i >= 0; i--)
{
if ((this.imageList.get(i)).contains(e.getX(), e.getY()))
{
this.selectedImage = i;
if (e.getButton() == MouseEvent.BUTTON3)
{
this.imageList.add(((Sprite) this.imageList.get(i))); // add a copy of the current Sprite to the front of the list
this.imageList.remove(i); // delete the Sprite from its original position
}
this.imageList.get(i).setOffset(e.getX(), e.getY());
break;
}
}
this.repaint();
}
@Override
public void mouseClicked(MouseEvent e)
{
}
@Override
public void mouseReleased(MouseEvent e)
{
}
@Override
public void mouseEntered(MouseEvent e)
{
}
@Override
public void mouseExited(MouseEvent e)
{
}
@Override
public void mouseMoved(MouseEvent e)
{
}
@Override
public void mouseDragged(MouseEvent e)
{
if ((this.imageList.get(this.selectedImage)).contains(e.getX(), e.getY()))
{
(this.imageList.get(this.selectedImage)).move(e.getX(), e.getY());
this.repaint();
}
}
public void paintList(ArrayList imageList)
{
this.imageList = imageList;
this.repaint();
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (this.imageList != null)
{
// draw the sprites
for (int i = 0; i < this.imageList.size(); i++)
{
g.drawImage(((this.imageList.get(i))).getImage(),
((this.imageList.get(i))).getX(),
((this.imageList.get(i))).getY(), this);
}
}
}
}
//Sprite
public class Sprite
{
public final static int NEW = 1;
public final static int NORMAL = 2;
public final static int DELETED = 3;
private final Image img;
private int state = Sprite.NORMAL; // can be NORMAL, NEW or DELETED used to trigger animation
private int x = 0; // initialise at position 0, 0
private int y = 0;
private int offsetX = 0;
private int offsetY = 0;
public Sprite(Image img)
{
super();
this.img = img;
}
public Image getImage()
{
return this.img;
}
public int getX()
{
return (int) this.x;
}
public int getY()
{
return (int) this.y;
}
public int getWidth()
{
return this.img.getWidth(rootPane);
}
public int getHeight()
{
return this.img.getHeight(rootPane);
}
public int getState()
{
return this.state;
}
public void setState(int state)
{
this.state = state;
}
public boolean isNormal()
{
return (this.state == NORMAL);
}
public boolean isNew()
{
return (this.state == NEW);
}
public boolean isDeleted()
{
return (this.state == DELETED);
}
public void move(int mouseX, int mouseY) // move top left corner to position x,y
{
this.x = mouseX - this.offsetX;
this.y = mouseY - this.offsetY;
}
public void setOffset(int mouseX, int mouseY)
{
this.offsetX = mouseX - this.x;
this.offsetY = mouseY - this.y;
}
public boolean contains(int x, int y)
{
return ((x >= (int) this.x) &&
(x <= (int) this.x + this.img.getWidth(rootPane)) &&
(y >= (int) this.y) &&
(y <= (int) this.y + this.img.getHeight(rootPane)));
}
}
}
Copyright Derek O' Reilly, Dundalk Institute of Technology (DkIT), Dundalk, Co. Louth, Ireland.