Animação de texto
Esta dica Java mostra como criar uma pequena animação de texto.
<SPAN >
<P class=MsoNormal ><SPAN ><STRONG>Animação de texto</STRONG></FONT></SPAN></P>
<P class=MsoNormal ><SPAN ><STRONG></STRONG></FONT></SPAN> </P>
<P class=MsoNormal ><SPAN >Esta dica Java mostra como criar uma pequena animação de texto.</FONT></SPAN></SPAN>
<B><SPAN ></SPAN></B>
<B><SPAN ><amp-img src='https://www.devmedia.com.br/imagens/javamagazine/figanimatexto.JPG' alt='DevMedia' height='372' width='650' layout='responsive'></amp-img></SPAN></B>
<B><SPAN ></SPAN></B>
<B><SPAN >import </SPAN></B><SPAN >java.awt.BasicStroke;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.BorderLayout;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Checkbox;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Choice;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Color;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Component;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Dimension;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Font;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Frame;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.GradientPaint;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Graphics;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Graphics2D;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.GraphicsEnvironment;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.GridLayout;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Image;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Label;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.MediaTracker;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Panel;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.RenderingHints;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.Toolkit;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.event.ComponentAdapter;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.event.ComponentEvent;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.event.ItemEvent;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.event.ItemListener;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.font.FontRenderContext;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.geom.Rectangle2D;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.awt.image.BufferedImage;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.net.URL;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.text.NumberFormat;</SPAN><B><SPAN >import </SPAN></B><SPAN >java.util.Random;</SPAN><B><SPAN >import </SPAN></B><SPAN >javax.swing.JFrame;</SPAN><B><SPAN >import </SPAN></B><SPAN >javax.swing.JPanel;</SPAN><B><SPAN >public class </SPAN></B><SPAN >TextBouncer </SPAN><B><SPAN >extends </SPAN></B><SPAN >JPanel </SPAN><B><SPAN >implements </SPAN></B><SPAN >Runnable {</SPAN><SPAN > </SPAN><B><SPAN >private boolean </SPAN></B><SPAN >trucking = </SPAN><B><SPAN >true</SPAN></B><SPAN >;</SPAN><SPAN > </SPAN><B><SPAN >private long</SPAN></B><SPAN >[] previousTimes; </SPAN><SPAN >// millisegundos</SPAN><SPAN > </SPAN><B><SPAN >private int </SPAN></B><SPAN >previousIndex;</SPAN><SPAN > </SPAN><B><SPAN >private boolean </SPAN></B><SPAN >previousFilled;</SPAN><SPAN > </SPAN><B><SPAN >private double </SPAN></B><SPAN >frameRate; </SPAN><SPAN >// frames por segundo</SPAN>
<SPAN > </SPAN><B><SPAN lang=EN-US >private </SPAN></B><SPAN lang=EN-US >Image image = </SPAN><B><SPAN lang=EN-US >null</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public static void </SPAN></B><SPAN lang=EN-US >main(String[] args) {</SPAN><SPAN lang=EN-US >String s = </SPAN><SPAN lang=EN-US >"Java Source and Support"</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >final int </SPAN></B><SPAN lang=EN-US >size = </SPAN><SPAN lang=EN-US >64</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(args.length > </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >)</SPAN><SPAN lang=EN-US >s = args[</SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >];</SPAN><SPAN lang=EN-US >Panel controls = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Panel();</SPAN><B><SPAN lang=EN-US >final </SPAN></B><SPAN lang=EN-US >Choice choice = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Choice();</SPAN><SPAN lang=EN-US >GraphicsEnvironment ge = GraphicsEnvironment</SPAN><SPAN lang=EN-US >.getLocalGraphicsEnvironment();</SPAN><SPAN lang=EN-US >Font[] allFonts = ge.getAllFonts();</SPAN><B><SPAN lang=EN-US >for </SPAN></B><SPAN lang=EN-US >(</SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >i = </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >; i < allFonts.length; i++)</SPAN><SPAN lang=EN-US >choice.addItem(allFonts[i].getName());</SPAN><SPAN lang=EN-US >Font defaultFont = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Font(allFonts[</SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >].getName(), Font.PLAIN, size);</SPAN><B><SPAN lang=EN-US >final </SPAN></B><SPAN lang=EN-US >TextBouncer bouncer = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >TextBouncer(s, defaultFont);</SPAN><SPAN lang=EN-US >Frame f = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >AnimationFrame(bouncer);</SPAN><SPAN lang=EN-US >f.setFont(</SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Font(</SPAN><SPAN lang=EN-US >"Serif"</SPAN><SPAN lang=EN-US >, Font.PLAIN, </SPAN><SPAN lang=EN-US >12</SPAN><SPAN lang=EN-US >));</SPAN><SPAN lang=EN-US >controls.add(bouncer.createCheckbox(</SPAN><SPAN lang=EN-US >"Antialiasing"</SPAN><SPAN lang=EN-US >,</SPAN><SPAN lang=EN-US >TextBouncer.ANTIALIASING));</SPAN><SPAN lang=EN-US >controls.add(bouncer.createCheckbox(</SPAN><SPAN lang=EN-US >"Gradient"</SPAN><SPAN lang=EN-US >, TextBouncer.GRADIENT));</SPAN><SPAN lang=EN-US >controls.add(bouncer.createCheckbox(</SPAN><SPAN lang=EN-US >"Shear"</SPAN><SPAN lang=EN-US >, TextBouncer.SHEAR));</SPAN><SPAN lang=EN-US >controls.add(bouncer.createCheckbox(</SPAN><SPAN lang=EN-US >"Rotate"</SPAN><SPAN lang=EN-US >, TextBouncer.ROTATE));</SPAN><SPAN lang=EN-US >controls.add(bouncer.createCheckbox(</SPAN><SPAN lang=EN-US >"Axes"</SPAN><SPAN lang=EN-US >, TextBouncer.AXES));</SPAN><SPAN lang=EN-US >Panel fontControls = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Panel();</SPAN><SPAN lang=EN-US >choice.addItemListener(</SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >ItemListener() {</SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >itemStateChanged(ItemEvent ie) {</SPAN><SPAN lang=EN-US >Font font = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Font(choice.getSelectedItem(), Font.PLAIN, size);</SPAN><SPAN lang=EN-US >bouncer.setFont(font);</SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US >});</SPAN><SPAN lang=EN-US >fontControls.add(choice);</SPAN><SPAN lang=EN-US >Panel allControls = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Panel(</SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >GridLayout(</SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >, </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >));</SPAN><SPAN lang=EN-US >allControls.add(controls);</SPAN><SPAN lang=EN-US >allControls.add(fontControls);</SPAN><SPAN lang=EN-US >f.add(allControls, BorderLayout.NORTH);</SPAN><SPAN lang=EN-US >f.setSize(</SPAN><SPAN lang=EN-US >300</SPAN><SPAN lang=EN-US >,</SPAN><SPAN lang=EN-US >300</SPAN><SPAN lang=EN-US >);</SPAN><SPAN lang=EN-US >f.setVisible(</SPAN><B><SPAN lang=EN-US >true</SPAN></B><SPAN lang=EN-US >);</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private boolean </SPAN></B><SPAN lang=EN-US >mAntialiasing = false, mGradient = </SPAN><B><SPAN lang=EN-US >false</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private boolean </SPAN></B><SPAN lang=EN-US >mShear = false, mRotate = false, mAxes = </SPAN><B><SPAN lang=EN-US >false</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public static final int </SPAN></B><SPAN lang=EN-US >ANTIALIASING = </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public static final int </SPAN></B><SPAN lang=EN-US >GRADIENT = </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public static final int </SPAN></B><SPAN lang=EN-US >SHEAR = </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public static final int </SPAN></B><SPAN lang=EN-US >ROTATE = </SPAN><SPAN lang=EN-US >3</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public static final int </SPAN></B><SPAN lang=EN-US >AXES = </SPAN><SPAN lang=EN-US >5</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private float </SPAN></B><SPAN lang=EN-US >mDeltaX, mDeltaY;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private float </SPAN></B><SPAN lang=EN-US >mX, mY, mWidth, mHeight;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private float </SPAN></B><SPAN lang=EN-US >mTheta;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private float </SPAN></B><SPAN lang=EN-US >mShearX, mShearY, mShearDeltaX, mShearDeltaY;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private </SPAN></B><SPAN lang=EN-US >String mString;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public </SPAN></B><SPAN lang=EN-US >TextBouncer(String s, Font f) {</SPAN><SPAN lang=EN-US >previousTimes = </SPAN><B><SPAN lang=EN-US >new long</SPAN></B><SPAN lang=EN-US >[</SPAN><SPAN lang=EN-US >128</SPAN><SPAN lang=EN-US >];</SPAN><SPAN lang=EN-US >previousTimes[</SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >] = System.currentTimeMillis();</SPAN><SPAN lang=EN-US >previousIndex = </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >previousFilled = </SPAN><B><SPAN lang=EN-US >false</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >mString = s;</SPAN><SPAN lang=EN-US >setFont(f);</SPAN><SPAN lang=EN-US >Random random = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Random();</SPAN><SPAN lang=EN-US >mX = random.nextFloat() * </SPAN><SPAN lang=EN-US >500</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >mY = random.nextFloat() * </SPAN><SPAN lang=EN-US >500</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >mDeltaX = random.nextFloat() * </SPAN><SPAN lang=EN-US >3</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >mDeltaY = random.nextFloat() * </SPAN><SPAN lang=EN-US >3</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >mShearX = random.nextFloat() / </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >mShearY = random.nextFloat() / </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >mShearDeltaX = mShearDeltaY = </SPAN><SPAN lang=EN-US >.05f</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >FontRenderContext frc = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >FontRenderContext(null, true, </SPAN><B><SPAN lang=EN-US >false</SPAN></B><SPAN lang=EN-US >);</SPAN><SPAN lang=EN-US >Rectangle2D bounds = getFont().getStringBounds(mString, frc);</SPAN><SPAN lang=EN-US >mWidth = (</SPAN><B><SPAN lang=EN-US >float</SPAN></B><SPAN lang=EN-US >) bounds.getWidth();</SPAN><SPAN lang=EN-US >mHeight = (</SPAN><B><SPAN lang=EN-US >float</SPAN></B><SPAN lang=EN-US >) bounds.getHeight();</SPAN><SPAN lang=EN-US >addComponentListener(</SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >ComponentAdapter() {</SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >componentResized(ComponentEvent ce) {</SPAN><SPAN lang=EN-US >Dimension d = getSize();</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mX < </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >)</SPAN><SPAN lang=EN-US >mX = </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >else if </SPAN></B><SPAN lang=EN-US >(mX + mWidth >= d.width)</SPAN><SPAN lang=EN-US >mX = d.width - mWidth - </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mY < </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >)</SPAN><SPAN lang=EN-US >mY = </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >else if </SPAN></B><SPAN lang=EN-US >(mY + mHeight >= d.height)</SPAN><SPAN lang=EN-US >mY = d.height - mHeight - </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US >});</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >setSwitch(</SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >item, </SPAN><B><SPAN lang=EN-US >boolean </SPAN></B><SPAN lang=EN-US >value) {</SPAN><B><SPAN lang=EN-US >switch </SPAN></B><SPAN lang=EN-US >(item) { </SPAN><B><SPAN lang=EN-US >case </SPAN></B><SPAN lang=EN-US >ANTIALIASING:</SPAN><SPAN lang=EN-US >mAntialiasing = value;</SPAN><B><SPAN lang=EN-US >break</SPAN></B><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >case </SPAN></B><SPAN lang=EN-US >GRADIENT:</SPAN><SPAN lang=EN-US >mGradient = value;</SPAN><B><SPAN lang=EN-US >break</SPAN></B><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >case </SPAN></B><SPAN lang=EN-US >SHEAR:</SPAN><SPAN lang=EN-US >mShear = value;</SPAN><B><SPAN lang=EN-US >break</SPAN></B><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >case </SPAN></B><SPAN lang=EN-US >ROTATE:</SPAN><SPAN lang=EN-US >mRotate = value;</SPAN><B><SPAN lang=EN-US >break</SPAN></B><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >case </SPAN></B><SPAN lang=EN-US >AXES:</SPAN><SPAN lang=EN-US >mAxes = value;</SPAN><B><SPAN lang=EN-US >break</SPAN></B><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >default</SPAN></B><SPAN lang=EN-US >:</SPAN><B><SPAN lang=EN-US >break</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >protected </SPAN></B><SPAN lang=EN-US >Checkbox createCheckbox(String label, </SPAN><B><SPAN lang=EN-US >final int </SPAN></B><SPAN lang=EN-US >item) {</SPAN><SPAN lang=EN-US >Checkbox check = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Checkbox(label);</SPAN><SPAN lang=EN-US >check.addItemListener(</SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >ItemListener() {</SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >itemStateChanged(ItemEvent ie) {</SPAN><SPAN lang=EN-US >setSwitch(item, (ie.getStateChange() == ie.SELECTED));</SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US >});</SPAN><B><SPAN lang=EN-US >return </SPAN></B><SPAN lang=EN-US >check;</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >timeStep() {</SPAN><SPAN lang=EN-US >Dimension d = getSize();</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mX + mDeltaX < </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >)</SPAN><SPAN lang=EN-US >mDeltaX = -mDeltaX;</SPAN><B><SPAN lang=EN-US >else if </SPAN></B><SPAN lang=EN-US >(mX + mWidth + mDeltaX >= d.width)</SPAN><SPAN lang=EN-US >mDeltaX = -mDeltaX;</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mY + mDeltaY < </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >)</SPAN><SPAN lang=EN-US >mDeltaY = -mDeltaY;</SPAN><B><SPAN lang=EN-US >else if </SPAN></B><SPAN lang=EN-US >(mY + mHeight + mDeltaY >= d.height)</SPAN><SPAN lang=EN-US >mDeltaY = -mDeltaY;</SPAN><SPAN lang=EN-US >mX += mDeltaX;</SPAN><SPAN lang=EN-US >mY += mDeltaY;</SPAN><SPAN lang=EN-US >mTheta += Math.PI / </SPAN><SPAN lang=EN-US >192</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mTheta > (</SPAN><SPAN lang=EN-US >2 </SPAN><SPAN lang=EN-US >* Math.PI))</SPAN><SPAN lang=EN-US >mTheta -= (</SPAN><SPAN lang=EN-US >2 </SPAN><SPAN lang=EN-US >* Math.PI);</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mShearX + mShearDeltaX > </SPAN><SPAN lang=EN-US >.5</SPAN><SPAN lang=EN-US >)</SPAN><SPAN lang=EN-US >mShearDeltaX = -mShearDeltaX;</SPAN><B><SPAN lang=EN-US >else if </SPAN></B><SPAN lang=EN-US >(mShearX + mShearDeltaX < -</SPAN><SPAN lang=EN-US >.5</SPAN><SPAN lang=EN-US >)</SPAN><SPAN lang=EN-US >mShearDeltaX = -mShearDeltaX;</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mShearY + mShearDeltaY > </SPAN><SPAN lang=EN-US >.5</SPAN><SPAN lang=EN-US >)</SPAN><SPAN lang=EN-US >mShearDeltaY = -mShearDeltaY;</SPAN><B><SPAN lang=EN-US >else if </SPAN></B><SPAN lang=EN-US >(mShearY + mShearDeltaY < -</SPAN><SPAN lang=EN-US >.5</SPAN><SPAN lang=EN-US >)</SPAN><SPAN lang=EN-US >mShearDeltaY = -mShearDeltaY;</SPAN><SPAN lang=EN-US >mShearX += mShearDeltaX;</SPAN><SPAN lang=EN-US >mShearY += mShearDeltaY;</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >paint(Graphics g) {</SPAN><SPAN lang=EN-US >Graphics2D g2 = (Graphics2D) g;</SPAN><SPAN lang=EN-US >setAntialiasing(g2);</SPAN><SPAN lang=EN-US >setTransform(g2);</SPAN><SPAN lang=EN-US >setPaint(g2);</SPAN><SPAN lang=EN-US >// Desenha a string.</SPAN><SPAN lang=EN-US >g2.setFont(getFont());</SPAN><SPAN lang=EN-US >g2.drawString(mString, mX, mY + mHeight);</SPAN><SPAN lang=EN-US >drawAxes(g2);</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >protected void </SPAN></B><SPAN lang=EN-US >setAntialiasing(Graphics2D g2) {</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mAntialiasing == </SPAN><B><SPAN lang=EN-US >false</SPAN></B><SPAN lang=EN-US >)</SPAN><B><SPAN lang=EN-US >return</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,</SPAN><SPAN lang=EN-US >RenderingHints.VALUE_ANTIALIAS_ON);</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >protected void </SPAN></B><SPAN lang=EN-US >setTransform(Graphics2D g2) {</SPAN><SPAN lang=EN-US >Dimension d = getSize();</SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >cx = d.width / </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >cy = d.height / </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >g2.translate(cx, cy);</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mShear)</SPAN><SPAN lang=EN-US >g2.shear(mShearX, mShearY);</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mRotate)</SPAN><SPAN lang=EN-US >g2.rotate(mTheta);</SPAN><SPAN lang=EN-US >g2.translate(-cx, -cy);</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >protected void </SPAN></B><SPAN lang=EN-US >setPaint(Graphics2D g2) {</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mGradient) {</SPAN><SPAN lang=EN-US >GradientPaint gp = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >GradientPaint(</SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >, </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >, Color.blue, </SPAN><SPAN lang=EN-US >50</SPAN><SPAN lang=EN-US >, </SPAN><SPAN lang=EN-US >25</SPAN><SPAN lang=EN-US >,</SPAN><SPAN lang=EN-US >Color.green, </SPAN><B><SPAN lang=EN-US >true</SPAN></B><SPAN lang=EN-US >);</SPAN><SPAN lang=EN-US >g2.setPaint(gp);</SPAN><SPAN lang=EN-US >} </SPAN><B><SPAN lang=EN-US >else</SPAN></B><SPAN lang=EN-US >g2.setPaint(Color.orange);</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >protected void </SPAN></B><SPAN lang=EN-US >drawAxes(Graphics2D g2) {</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(mAxes == </SPAN><B><SPAN lang=EN-US >false</SPAN></B><SPAN lang=EN-US >)</SPAN><B><SPAN lang=EN-US >return</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >g2.setPaint(getForeground());</SPAN><SPAN lang=EN-US >g2.setStroke(</SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >BasicStroke());</SPAN><SPAN lang=EN-US >Dimension d = getSize();</SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >side = </SPAN><SPAN lang=EN-US >20</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >arrow = </SPAN><SPAN lang=EN-US >4</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >w = d.width / </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >, h = d.height / </SPAN><SPAN lang=EN-US >2</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >g2.drawLine(w - side, h, w + side, h);</SPAN><SPAN lang=EN-US >g2.drawLine(w + side - arrow, h - arrow, w + side, h);</SPAN><SPAN lang=EN-US >g2.drawLine(w, h - side, w, h + side);</SPAN><SPAN lang=EN-US >g2.drawLine(w + arrow, h + side - arrow, w, h + side);</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >run() {</SPAN><B><SPAN lang=EN-US >while </SPAN></B><SPAN lang=EN-US >(trucking) {</SPAN><SPAN lang=EN-US >render();</SPAN><SPAN lang=EN-US >timeStep();</SPAN><SPAN lang=EN-US >calculateFrameRate();</SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >protected void </SPAN></B><SPAN lang=EN-US >render() {</SPAN><SPAN lang=EN-US >Graphics g = getGraphics();</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(g != </SPAN><B><SPAN lang=EN-US >null</SPAN></B><SPAN lang=EN-US >) {</SPAN><SPAN lang=EN-US >Dimension d = getSize();</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(checkImage(d)) {</SPAN><SPAN lang=EN-US >Graphics imageGraphics = image.getGraphics();</SPAN><SPAN lang=EN-US >imageGraphics.setColor(getBackground());</SPAN><SPAN lang=EN-US >imageGraphics.fillRect(</SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >, </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >, d.width, d.height);</SPAN><SPAN lang=EN-US >imageGraphics.setColor(getForeground());</SPAN><SPAN lang=EN-US >paint(imageGraphics);</SPAN><SPAN lang=EN-US >g.drawImage(image, </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >, </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >, </SPAN><B><SPAN lang=EN-US >null</SPAN></B><SPAN lang=EN-US >);</SPAN><SPAN lang=EN-US >imageGraphics.dispose();</SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US >g.dispose();</SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >protected boolean </SPAN></B><SPAN lang=EN-US >checkImage(Dimension d) {</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(d.width == </SPAN><SPAN lang=EN-US >0 </SPAN><SPAN lang=EN-US >|| d.height == </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >)</SPAN><B><SPAN lang=EN-US >return false</SPAN></B><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(image == </SPAN><B><SPAN lang=EN-US >null </SPAN></B><SPAN lang=EN-US >|| image.getWidth(</SPAN><B><SPAN lang=EN-US >null</SPAN></B><SPAN lang=EN-US >) != d.width</SPAN><SPAN lang=EN-US >|| image.getHeight(</SPAN><B><SPAN lang=EN-US >null</SPAN></B><SPAN lang=EN-US >) != d.height) {</SPAN><SPAN lang=EN-US >image = createImage(d.width, d.height);</SPAN><SPAN lang=EN-US >}</SPAN><B><SPAN lang=EN-US >return true</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >protected void </SPAN></B><SPAN lang=EN-US >calculateFrameRate() {</SPAN> <B><SPAN lang=EN-US >long </SPAN></B><SPAN lang=EN-US >now = System.currentTimeMillis();</SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >numberOfFrames = previousTimes.length;</SPAN><B><SPAN lang=EN-US >double </SPAN></B><SPAN lang=EN-US >newRate;</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(previousFilled)</SPAN><SPAN lang=EN-US >newRate = (</SPAN><B><SPAN lang=EN-US >double</SPAN></B><SPAN lang=EN-US >) numberOfFrames</SPAN><SPAN lang=EN-US >/ (</SPAN><B><SPAN lang=EN-US >double</SPAN></B><SPAN lang=EN-US >) (now - previousTimes[previousIndex]) * </SPAN><SPAN lang=EN-US >1000.0</SPAN><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >else</SPAN></B><SPAN lang=EN-US >newRate = </SPAN><SPAN lang=EN-US >1000.0 </SPAN><SPAN lang=EN-US >/ (</SPAN><B><SPAN lang=EN-US >double</SPAN></B><SPAN lang=EN-US >) (now - previousTimes[numberOfFrames - </SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >]);</SPAN><SPAN lang=EN-US >firePropertyChange(</SPAN><SPAN lang=EN-US >"frameRate"</SPAN><SPAN lang=EN-US >, frameRate, newRate);</SPAN><SPAN lang=EN-US >frameRate = newRate;</SPAN><SPAN lang=EN-US >previousTimes[previousIndex] = now;</SPAN><SPAN lang=EN-US >previousIndex++;</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(previousIndex >= numberOfFrames) {</SPAN><SPAN lang=EN-US >previousIndex = </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >previousFilled = </SPAN><B><SPAN lang=EN-US >true</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public double </SPAN></B><SPAN lang=EN-US >getFrameRate() {</SPAN><B><SPAN lang=EN-US >return </SPAN></B><SPAN lang=EN-US >frameRate;</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private transient </SPAN></B><SPAN lang=EN-US >AnimationFrame mRateListener;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >setRateListener(AnimationFrame af) {</SPAN><SPAN lang=EN-US >mRateListener = af;</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >firePropertyChange(String name, </SPAN><B><SPAN lang=EN-US >double </SPAN></B><SPAN lang=EN-US >oldValue, </SPAN><B><SPAN lang=EN-US >double </SPAN></B><SPAN lang=EN-US >newValue) {</SPAN><SPAN lang=EN-US >mRateListener.rateChanged(newValue);</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private static </SPAN></B><SPAN lang=EN-US >Component sComponent = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Component() {</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >};</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private static final </SPAN></B><SPAN lang=EN-US >MediaTracker sTracker = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >MediaTracker(sComponent);</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private static int </SPAN></B><SPAN lang=EN-US >sID = </SPAN><SPAN lang=EN-US >0</SPAN><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public static boolean </SPAN></B><SPAN lang=EN-US >waitForImage(Image image) {</SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >id;</SPAN><B><SPAN lang=EN-US >synchronized </SPAN></B><SPAN lang=EN-US >(sComponent) {</SPAN><SPAN lang=EN-US >id = sID++;</SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US >sTracker.addImage(image, id);</SPAN><B><SPAN lang=EN-US >try </SPAN></B><SPAN lang=EN-US >{</SPAN><SPAN lang=EN-US >sTracker.waitForID(id);</SPAN><SPAN lang=EN-US >} </SPAN><B><SPAN lang=EN-US >catch </SPAN></B><SPAN lang=EN-US >(InterruptedException ie) {</SPAN><B><SPAN lang=EN-US >return false</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >}</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(sTracker.isErrorID(id))</SPAN><B><SPAN lang=EN-US >return false</SPAN></B><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >return true</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public </SPAN></B><SPAN lang=EN-US >Image blockingLoad(String path) {</SPAN><SPAN lang=EN-US >Image image = Toolkit.getDefaultToolkit().getImage(path);</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(waitForImage(image) == </SPAN><B><SPAN lang=EN-US >false</SPAN></B><SPAN lang=EN-US >)</SPAN><B><SPAN lang=EN-US >return null</SPAN></B><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >return </SPAN></B><SPAN lang=EN-US >image;</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public static </SPAN></B><SPAN lang=EN-US >Image blockingLoad(URL url) {</SPAN><SPAN lang=EN-US >Image image = Toolkit.getDefaultToolkit().getImage(url);</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(waitForImage(image) == </SPAN><B><SPAN lang=EN-US >false</SPAN></B><SPAN lang=EN-US >)</SPAN><B><SPAN lang=EN-US >return null</SPAN></B><SPAN lang=EN-US >;</SPAN><B><SPAN lang=EN-US >return </SPAN></B><SPAN lang=EN-US >image;</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public </SPAN></B><SPAN lang=EN-US >BufferedImage makeBufferedImage(Image image) {</SPAN><B><SPAN lang=EN-US >return </SPAN></B><SPAN lang=EN-US >makeBufferedImage(image, BufferedImage.TYPE_INT_RGB);</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public </SPAN></B><SPAN lang=EN-US >BufferedImage makeBufferedImage(Image image, </SPAN><B><SPAN lang=EN-US >int </SPAN></B><SPAN lang=EN-US >imageType) {</SPAN><B><SPAN lang=EN-US >if </SPAN></B><SPAN lang=EN-US >(waitForImage(image) == </SPAN><B><SPAN lang=EN-US >false</SPAN></B><SPAN lang=EN-US >)</SPAN><B><SPAN lang=EN-US >return null</SPAN></B><SPAN lang=EN-US >;</SPAN><SPAN lang=EN-US >BufferedImage bufferedImage = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >BufferedImage(image.getWidth(</SPAN><B><SPAN lang=EN-US >null</SPAN></B><SPAN lang=EN-US >),</SPAN><SPAN lang=EN-US >image.getHeight(</SPAN><B><SPAN lang=EN-US >null</SPAN></B><SPAN lang=EN-US >), imageType);</SPAN><SPAN lang=EN-US >Graphics2D g2 = bufferedImage.createGraphics();</SPAN><SPAN lang=EN-US >g2.drawImage(image, null, </SPAN><B><SPAN lang=EN-US >null</SPAN></B><SPAN lang=EN-US >);</SPAN><B><SPAN lang=EN-US >return </SPAN></B><SPAN lang=EN-US >bufferedImage;</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US >}</SPAN><B><SPAN lang=EN-US >class </SPAN></B><SPAN lang=EN-US >AnimationFrame </SPAN><B><SPAN lang=EN-US >extends </SPAN></B><SPAN lang=EN-US >JFrame {</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private </SPAN></B><SPAN lang=EN-US >Label mStatusLabel;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >private </SPAN></B><SPAN lang=EN-US >NumberFormat mFormat;</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public </SPAN></B><SPAN lang=EN-US >AnimationFrame(TextBouncer ac) {</SPAN><B><SPAN lang=EN-US >super</SPAN></B><SPAN lang=EN-US >();</SPAN><SPAN lang=EN-US >setLayout(</SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >BorderLayout());</SPAN><SPAN lang=EN-US >add(ac, BorderLayout.CENTER);</SPAN><SPAN lang=EN-US >add(mStatusLabel = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Label(), BorderLayout.SOUTH);</SPAN><SPAN lang=EN-US >mFormat = NumberFormat.getInstance();</SPAN><SPAN lang=EN-US >mFormat.setMaximumFractionDigits(</SPAN><SPAN lang=EN-US >1</SPAN><SPAN lang=EN-US >);</SPAN><SPAN lang=EN-US >ac.setRateListener(</SPAN><B><SPAN lang=EN-US >this</SPAN></B><SPAN lang=EN-US >);</SPAN><SPAN lang=EN-US >Thread t = </SPAN><B><SPAN lang=EN-US >new </SPAN></B><SPAN lang=EN-US >Thread(ac);</SPAN><SPAN lang=EN-US >t.start();</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US > </SPAN><B><SPAN lang=EN-US >public void </SPAN></B><SPAN lang=EN-US >rateChanged(</SPAN><B><SPAN lang=EN-US >double </SPAN></B><SPAN lang=EN-US >frameRate) {</SPAN><SPAN lang=EN-US >mStatusLabel.setText(mFormat.format(frameRate) + </SPAN><SPAN lang=EN-US >" fps"</SPAN><SPAN lang=EN-US >);</SPAN><SPAN lang=EN-US > </SPAN><SPAN lang=EN-US >}</SPAN><SPAN lang=EN-US >}</SPAN>
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo