001 package com.croftsoft.core.animation.updater; 002 003 import java.awt.Rectangle; 004 import javax.swing.Icon; 005 import javax.swing.JComponent; 006 007 import com.croftsoft.core.lang.NullArgumentException; 008 import com.croftsoft.core.animation.Clock; 009 import com.croftsoft.core.animation.ComponentUpdater; 010 import com.croftsoft.core.animation.sprite.IconSprite; 011 012 /********************************************************************* 013 * Rotates through a sequence of Icons. 014 * 015 * @version 016 * 2003-07-11 017 * @since 018 * 2002-03-15 019 * @author 020 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 021 *********************************************************************/ 022 023 public final class IconSequenceUpdater 024 implements ComponentUpdater 025 ////////////////////////////////////////////////////////////////////// 026 ////////////////////////////////////////////////////////////////////// 027 { 028 029 private final IconSprite iconSprite; 030 031 private final Icon [ ] icons; 032 033 private final long framePeriodNanos; 034 035 private final Clock clock; 036 037 private final Rectangle oldPaintBounds; 038 039 private final Rectangle newPaintBounds; 040 041 // 042 043 private long lastUpdateTimeNanos; 044 045 private int index; 046 047 ////////////////////////////////////////////////////////////////////// 048 ////////////////////////////////////////////////////////////////////// 049 050 public IconSequenceUpdater ( 051 IconSprite iconSprite, 052 Icon [ ] icons, 053 long framePeriodNanos, 054 Clock clock ) 055 ////////////////////////////////////////////////////////////////////// 056 { 057 NullArgumentException.check ( this.iconSprite = iconSprite ); 058 059 NullArgumentException.check ( this.icons = icons ); 060 061 this.framePeriodNanos = framePeriodNanos; 062 063 NullArgumentException.check ( this.clock = clock ); 064 065 oldPaintBounds = new Rectangle ( ); 066 067 newPaintBounds = new Rectangle ( ); 068 } 069 070 ////////////////////////////////////////////////////////////////////// 071 ////////////////////////////////////////////////////////////////////// 072 073 public void update ( JComponent component ) 074 ////////////////////////////////////////////////////////////////////// 075 { 076 long updateTimeNanos = clock.currentTimeNanos ( ); 077 078 if ( updateTimeNanos < lastUpdateTimeNanos + framePeriodNanos ) 079 { 080 return; 081 } 082 083 lastUpdateTimeNanos = updateTimeNanos; 084 085 iconSprite.getPaintBounds ( oldPaintBounds ); 086 087 iconSprite.setIcon ( icons [ index ] ); 088 089 iconSprite.getPaintBounds ( newPaintBounds ); 090 091 newPaintBounds.add ( oldPaintBounds ); 092 093 component.repaint ( newPaintBounds ); 094 095 index = ( index + 1 ) % icons.length; 096 } 097 098 ////////////////////////////////////////////////////////////////////// 099 ////////////////////////////////////////////////////////////////////// 100 }