001 package com.croftsoft.apps.exemplar; 002 003 import java.awt.*; 004 import java.awt.event.ComponentAdapter; 005 import java.awt.event.ComponentEvent; 006 import javax.swing.JComponent; 007 008 import com.croftsoft.core.animation.ComponentAnimator; 009 import com.croftsoft.core.animation.animator.FrameRateAnimator; 010 import com.croftsoft.core.lang.NullArgumentException; 011 012 /*********************************************************************** 013 * ComponentAnimator. 014 * 015 * @version 016 * $Date: 2008/02/15 22:38:03 $ 017 * @since 018 * 2005-08-12 019 * @author 020 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 021 ***********************************************************************/ 022 023 public final class ExemplarAnimator 024 implements ComponentAnimator 025 //////////////////////////////////////////////////////////////////////// 026 //////////////////////////////////////////////////////////////////////// 027 { 028 029 private final ExemplarConfig exemplarConfig; 030 031 private final ExemplarModel exemplarModel; 032 033 private final Rectangle componentBounds; 034 035 private final FrameRateAnimator frameRateAnimator; 036 037 // 038 039 private String text; 040 041 private int x, y; 042 043 //////////////////////////////////////////////////////////////////////// 044 // constructor methods 045 //////////////////////////////////////////////////////////////////////// 046 047 /*********************************************************************** 048 * Main constructor. 049 ***********************************************************************/ 050 public ExemplarAnimator ( 051 final ExemplarConfig exemplarConfig, 052 final ExemplarModel exemplarModel, 053 final JComponent jComponent ) 054 //////////////////////////////////////////////////////////////////////// 055 { 056 NullArgumentException.checkArgs ( 057 this.exemplarConfig = exemplarConfig, 058 this.exemplarModel = exemplarModel, 059 jComponent ); 060 061 componentBounds = new Rectangle ( ); 062 063 jComponent.setOpaque ( true ); 064 065 jComponent.setFont ( exemplarConfig.getFont ( ) ); 066 067 jComponent.setCursor ( exemplarConfig.getCursor ( ) ); 068 069 jComponent.requestFocus ( ); 070 071 jComponent.addComponentListener ( 072 new ComponentAdapter ( ) 073 { 074 @Override 075 public void componentResized ( ComponentEvent componentEvent ) 076 { 077 update ( jComponent ); 078 079 jComponent.repaint ( ); 080 } 081 } ); 082 083 frameRateAnimator = new FrameRateAnimator ( jComponent ); 084 085 update ( jComponent ); 086 } 087 088 //////////////////////////////////////////////////////////////////////// 089 // interface ComponentAnimator methods 090 //////////////////////////////////////////////////////////////////////// 091 092 public void paint ( 093 final JComponent jComponent, 094 final Graphics2D graphics2D ) 095 //////////////////////////////////////////////////////////////////////// 096 { 097 graphics2D.setColor ( exemplarConfig.getBackgroundColor ( ) ); 098 099 graphics2D.fill ( componentBounds ); 100 101 graphics2D.setColor ( exemplarConfig.getForegroundColor ( ) ); 102 103 graphics2D.drawString ( text, x, y ); 104 105 frameRateAnimator.paint ( jComponent, graphics2D ); 106 } 107 108 public void update ( final JComponent jComponent ) 109 //////////////////////////////////////////////////////////////////////// 110 { 111 jComponent.getBounds ( componentBounds ); 112 113 final int offsetX = componentBounds.width / 2; 114 115 final int offsetY = componentBounds.height / 2; 116 117 final int radius = Math.min ( offsetX, offsetY ) / 2; 118 119 text = "Clicks: " + exemplarModel.getClickCount ( ); 120 121 x = offsetX + ( int ) Math.round ( 122 radius * Math.sin ( exemplarModel.getPhase ( ) ) ); 123 124 y = offsetY + ( int ) Math.round ( 125 radius * Math.cos ( exemplarModel.getPhase ( ) ) ); 126 127 frameRateAnimator.update ( jComponent ); 128 129 jComponent.paintImmediately ( componentBounds ); 130 } 131 132 //////////////////////////////////////////////////////////////////////// 133 //////////////////////////////////////////////////////////////////////// 134 }