package com.croftsoft.apps.exemplar; import java.awt.*; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import javax.swing.JComponent; import com.croftsoft.core.animation.ComponentAnimator; import com.croftsoft.core.animation.animator.FrameRateAnimator; import com.croftsoft.core.lang.NullArgumentException; /********************************************************************* * Exemplar ComponentAnimator. * * @version * $Date: 2006/06/22 13:46:22 $ * @since * 2005-08-12 * @author * David Wallace Croft *********************************************************************/ public final class Animator implements ComponentAnimator ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// { private final Config config; private final Accessor accessor; private final Rectangle componentBounds; private final FrameRateAnimator frameRateAnimator; // private String text; private int x, y; ////////////////////////////////////////////////////////////////////// // constructor methods ////////////////////////////////////////////////////////////////////// /********************************************************************* * Main constructor. *********************************************************************/ public Animator ( final Config config, final Accessor accessor, final JComponent jComponent ) ////////////////////////////////////////////////////////////////////// { NullArgumentException.checkArgs ( this.config = config, this.accessor = accessor, jComponent ); componentBounds = new Rectangle ( ); jComponent.setOpaque ( true ); jComponent.setFont ( config.getFont ( ) ); jComponent.setCursor ( config.getCursor ( ) ); jComponent.requestFocus ( ); jComponent.addComponentListener ( new ComponentAdapter ( ) { @Override public void componentResized ( ComponentEvent componentEvent ) { update ( jComponent ); jComponent.repaint ( ); } } ); frameRateAnimator = new FrameRateAnimator ( jComponent ); update ( jComponent ); } ////////////////////////////////////////////////////////////////////// // interface ComponentAnimator methods ////////////////////////////////////////////////////////////////////// public void paint ( final JComponent jComponent, final Graphics2D graphics2D ) ////////////////////////////////////////////////////////////////////// { graphics2D.setColor ( config.getBackgroundColor ( ) ); graphics2D.fill ( componentBounds ); graphics2D.setColor ( config.getForegroundColor ( ) ); graphics2D.drawString ( text, x, y ); frameRateAnimator.paint ( jComponent, graphics2D ); } public void update ( final JComponent jComponent ) ////////////////////////////////////////////////////////////////////// { jComponent.getBounds ( componentBounds ); final int offsetX = componentBounds.width / 2; final int offsetY = componentBounds.height / 2; final int radius = Math.min ( offsetX, offsetY ) / 2; text = "Clicks: " + accessor.getClickCount ( ); x = offsetX + ( int ) Math.round ( radius * Math.sin ( accessor.getPhase ( ) ) ); y = offsetY + ( int ) Math.round ( radius * Math.cos ( accessor.getPhase ( ) ) ); frameRateAnimator.update ( jComponent ); jComponent.paintImmediately ( componentBounds ); } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// }