001    /*
002     * LAPIS lightweight structured text processing system
003     *
004     * Copyright (C) 1998-2002 Carnegie Mellon University,
005     * Copyright (C) 2003 Massachusetts Institute of Technology.
006     * All rights reserved.
007     *
008     * This library is free software; you can redistribute it
009     * and/or modify it under the terms of the GNU General
010     * Public License as published by the Free Software
011     * Foundation, version 2.
012     *
013     * LAPIS homepage: http://graphics.lcs.mit.edu/lapis/
014     */
015    
016    package lapisx.swing;
017    
018    import java.awt.*;
019    import java.awt.event.*;
020    import javax.swing.*;
021    
022    public class Animation extends JComponent {
023        public static lapisx.util.Debug debug = lapisx.util.Debug.QUIET;
024    
025        boolean animating;
026        Image animatedImage;
027        Image frozenImage;
028    
029        public Animation (Image animatedImage, Image frozenImage) {
030            this (animatedImage, frozenImage, true);
031        }
032    
033        public Animation (Image animatedImage, Image frozenImage, boolean animating) {
034            this.animatedImage = animatedImage;
035            this.frozenImage = frozenImage;
036    
037            MediaTracker mt = new MediaTracker (this);
038            mt.addImage (animatedImage, 0);
039            mt.addImage (frozenImage, 1);
040            try {
041                mt.waitForAll ();
042            } catch (InterruptedException e) {}
043    
044            int w = animatedImage.getWidth (null);
045            int h = animatedImage.getHeight (null);
046            if (w == -1 || h == -1)
047                throw new RuntimeException ("image error: can't get width and height");
048    
049            w = Math.max (w, frozenImage.getWidth (null));
050            h = Math.max (h, frozenImage.getHeight (null));
051    
052            setPreferredSize (new Dimension (w, h));
053    
054            this.animating = animating;
055        }
056    
057        public synchronized boolean getAnimating () {
058            return animating;
059        }
060    
061        public synchronized void setAnimating (boolean animating) {
062            this.animating = animating;
063            repaint ();
064        }
065    
066        public void paintComponent (Graphics g) {
067            super.paintComponent (g);
068            debug.println ("Animation.paintComponent");
069                
070            if (animating)
071                g.drawImage (animatedImage, 0, 0, this);
072            else {
073                animatedImage.flush ();
074                g.drawImage (frozenImage, 0, 0, this);
075            }
076        }
077    
078        public static void main (String[] argv) throws Exception {
079            final Animation anim = 
080                new Animation (Toolkit.getDefaultToolkit ().getImage (argv[0]),
081                               Toolkit.getDefaultToolkit ().getImage (argv[1]),
082                               true);
083            JFrame f = new JFrame ("Animation"); 
084            f.getContentPane ().add (anim, BorderLayout.CENTER);
085            f.getContentPane ().setBackground (Color.red);
086            f.addWindowListener (new WindowAdapter () {
087                public void windowClosing (WindowEvent evt) {
088                    System.exit(0);
089                }
090            });
091            f.addMouseListener (new MouseAdapter () {
092                    public void mouseClicked (MouseEvent event) {
093                        anim.setAnimating (!anim.getAnimating ());
094                    }
095                });
096            f.pack ();
097            f.show ();
098        }
099    }