package examples; // Picture.java // Kenneth J. Goldman /***************************************************************** * When you call the constructor, pass in a String that's the * name of the image file, such as * Picture car = new Picture("redTractor.gif"); * and then you can move the Picture by calling its * setLocation method, such as * car.setLocation(x,y); * ****************************************************************/ import java.awt.*; import javax.swing.*; import java.util.*; public class Picture extends JComponent { private static final long serialVersionUID = 1L; private static Hashtable imagesFromFiles = new Hashtable(); Image img; Dimension preferredSize = new Dimension(50, 50); private static MediaTracker tracker; Image bufferedImage, bufferedClearImage; Graphics2D bufferedGraphics; int delay = 80; private static final AlphaComposite PAINT_RULE = AlphaComposite.SrcOver; private static final Color TRANSPARENT = new Color(0,0,0,0); public Picture() { this((Image) null); } public Picture(String imageFile) { this(); setImage(loadImage(imageFile,this)); } public Picture(Image img) { setOpaque(false); if (img != null) setImage(img); } public void setImage(String imageFile) { setImage(loadImage(imageFile,this)); } public synchronized void setImage(Image img) { this.img = img; bufferedGraphics = null; bufferedImage = null; if (img == null) preferredSize = new Dimension(0, 0); else preferredSize = new Dimension(img.getWidth(this), img.getHeight(this)); setSize(preferredSize); repaint(); } public Dimension getPreferredSize() { return preferredSize; } public void setBounds(int x, int y, int width, int height) { preferredSize = new Dimension(width, height); super.setBounds(x, y, width, height); repaint(); } public void paint(Graphics g) { ((Graphics2D)g).setComposite(PAINT_RULE); if (bufferedGraphics != null) { g.drawImage(bufferedImage, 0, 0, preferredSize.width, preferredSize.height, this); } else if (img != null) { g.drawImage(img, 0, 0, preferredSize.width, preferredSize.height, this); } } public static synchronized Image loadImage(String imageFile, Picture pc) { if (imagesFromFiles.containsKey(imageFile)) { return imagesFromFiles.get(imageFile); } else { try { Image img = Toolkit.getDefaultToolkit().getImage(imageFile); if (tracker == null) tracker = new MediaTracker(pc); tracker.addImage(img, 1); tracker.waitForAll(); imagesFromFiles.put(imageFile, img); return img; } catch (InterruptedException ioe) { System.err.println( "Couldn't load image from file " + imageFile); return null; } } } public synchronized final boolean imageUpdate(final Image img, final int infoflags, int x, int y, final int width, final int height) { if (this.img == img) { if (isShowing() && ((infoflags & ALLBITS) != 0) || ((infoflags & FRAMEBITS) != 0)) { if (bufferedGraphics == null) { // bufferedImage = createImage(width, height); bufferedImage = new java.awt.image.BufferedImage(width, height, java.awt.image.BufferedImage.TYPE_INT_ARGB); bufferedClearImage = new java.awt.image.BufferedImage(width, height, java.awt.image.BufferedImage.TYPE_INT_ARGB); bufferedGraphics = (Graphics2D) bufferedImage.getGraphics(); setSize(width, height); } bufferedGraphics.setBackground(TRANSPARENT); bufferedGraphics.setColor(TRANSPARENT); bufferedGraphics.clearRect(0,0,width,height); bufferedGraphics.setComposite(PAINT_RULE); bufferedGraphics.drawImage(img, 0, 0, width, height, this); img.getWidth(this); } } else { this.img.getWidth(this); // to request an update from the right image } return isShowing(); } public static void main(String[] args) { JFrame f = new JFrame("test"); f.getContentPane().setLayout(new FlowLayout()); Picture pc = new Picture("person.jpg"); f.add(pc); f.setVisible(true); f.addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent we) { System.exit(0); } }); } }