
{"id":3611,"date":"2010-03-12T11:31:22","date_gmt":"2010-03-12T14:31:22","guid":{"rendered":"https:\/\/eliezerladeira.com.br\/blog\/?p=3611"},"modified":"2026-02-09T11:56:45","modified_gmt":"2026-02-09T14:56:45","slug":"animation-bounce","status":"publish","type":"post","link":"https:\/\/eliezerladeira.com.br\/blog\/animation-bounce\/","title":{"rendered":"Animation: bounce"},"content":{"rendered":"<div id=\"post-680\" class=\"post-680 post type-post status-publish format-standard hentry\">\n<div class=\"entry\">\n<p><code><strong>import&nbsp;<\/strong>java.awt.BasicStroke;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.BorderLayout;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Checkbox;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Color;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Dimension;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Font;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Frame;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.GradientPaint;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Graphics;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Graphics2D;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Image;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Label;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Panel;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.RenderingHints;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Shape;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.Stroke;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.event.ComponentAdapter;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.event.ComponentEvent;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.event.ItemEvent;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.event.ItemListener;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.font.FontRenderContext;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.font.GlyphVector;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.geom.GeneralPath;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.awt.geom.Rectangle2D;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.text.NumberFormat;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>java.util.Random;<\/code><\/p>\n<p><code><strong>import&nbsp;<\/strong>javax.swing.JFrame;<\/code><br \/>\n<code><strong>import&nbsp;<\/strong>javax.swing.JPanel;<\/code><\/p>\n<p><code><strong>public&nbsp;class&nbsp;<\/strong>Bouncer&nbsp;<strong>extends&nbsp;<\/strong>JPanel&nbsp;<strong>implements&nbsp;<\/strong>Runnable&nbsp;{<\/code><br \/>\n<code><strong>private&nbsp;boolean&nbsp;<\/strong>trucking&nbsp;=&nbsp;<strong>true<\/strong>;<\/code><\/p>\n<p><code><strong>private&nbsp;long<\/strong>[]&nbsp;previousTimes;&nbsp;\/\/&nbsp;milliseconds<\/code><\/p>\n<p><code><strong>private&nbsp;int&nbsp;<\/strong>previousIndex;<\/code><\/p>\n<p><code><strong>private&nbsp;boolean&nbsp;<\/strong>previousFilled;<\/code><\/p>\n<p><code><strong>private&nbsp;double&nbsp;<\/strong>frameRate;&nbsp;\/\/&nbsp;frames&nbsp;per&nbsp;second<\/code><\/p>\n<p><code><strong>private&nbsp;<\/strong>Image&nbsp;image;<\/code><\/p>\n<p><code><strong>public&nbsp;static&nbsp;void&nbsp;<\/strong>main(String[]&nbsp;args)&nbsp;{<\/code><br \/>\n<code><strong>final&nbsp;<\/strong>Bouncer&nbsp;bouncer&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>Bouncer();<\/code><br \/>\n<code>Frame&nbsp;f&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>AnimationFrame(bouncer);<\/code><br \/>\n<code>f.setFont(<strong>new&nbsp;<\/strong>Font(\"Serif\",&nbsp;Font.PLAIN,&nbsp;12));<\/code><br \/>\n<code>f.setSize(200,&nbsp;200);<\/code><br \/>\n<code>Panel&nbsp;controls&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>Panel();<\/code><br \/>\n<code>controls.add(bouncer.createCheckbox(\"Anti.\",&nbsp;Bouncer.ANTIALIASING));<\/code><br \/>\n<code>controls.add(bouncer.createCheckbox(\"Trans.\",&nbsp;Bouncer.TRANSFORM));<\/code><br \/>\n<code>controls.add(bouncer.createCheckbox(\"Gradient\",&nbsp;Bouncer.GRADIENT));<\/code><br \/>\n<code>controls.add(bouncer.createCheckbox(\"Outline\",&nbsp;Bouncer.OUTLINE));<\/code><br \/>\n<code>controls.add(bouncer.createCheckbox(\"Dotted\",&nbsp;Bouncer.DOTTED));<\/code><br \/>\n<code>controls.add(bouncer.createCheckbox(\"Axes\",&nbsp;Bouncer.AXES));<\/code><br \/>\n<code>controls.add(bouncer.createCheckbox(\"Clip\",&nbsp;Bouncer.CLIP));<\/code><br \/>\n<code>f.add(controls,&nbsp;BorderLayout.NORTH);<\/code><\/p>\n<p><code>f.setVisible(<strong>true<\/strong>);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>\/\/&nbsp;Tweakable&nbsp;variables<\/code><br \/>\n<code><strong>private&nbsp;boolean&nbsp;<\/strong>mAntialiasing,&nbsp;mGradient,&nbsp;mOutline;<\/code><\/p>\n<p><code><strong>private&nbsp;boolean&nbsp;<\/strong>mTransform,&nbsp;mDotted,&nbsp;mAxes,&nbsp;mClip;<\/code><\/p>\n<p><code>\/\/&nbsp;...and&nbsp;the&nbsp;constants&nbsp;that&nbsp;represent&nbsp;them.&nbsp;See&nbsp;setSwitch().<\/code><br \/>\n<code><strong>public&nbsp;static&nbsp;final&nbsp;int&nbsp;<\/strong>ANTIALIASING&nbsp;=&nbsp;0;<\/code><\/p>\n<p><code><strong>public&nbsp;static&nbsp;final&nbsp;int&nbsp;<\/strong>GRADIENT&nbsp;=&nbsp;1;<\/code><\/p>\n<p><code><strong>public&nbsp;static&nbsp;final&nbsp;int&nbsp;<\/strong>OUTLINE&nbsp;=&nbsp;2;<\/code><\/p>\n<p><code><strong>public&nbsp;static&nbsp;final&nbsp;int&nbsp;<\/strong>TRANSFORM&nbsp;=&nbsp;3;<\/code><\/p>\n<p><code><strong>public&nbsp;static&nbsp;final&nbsp;int&nbsp;<\/strong>DOTTED&nbsp;=&nbsp;4;<\/code><\/p>\n<p><code><strong>public&nbsp;static&nbsp;final&nbsp;int&nbsp;<\/strong>AXES&nbsp;=&nbsp;5;<\/code><\/p>\n<p><code><strong>public&nbsp;static&nbsp;final&nbsp;int&nbsp;<\/strong>CLIP&nbsp;=&nbsp;6;<\/code><\/p>\n<p><code><strong>private&nbsp;float<\/strong>[]&nbsp;mPoints;<\/code><\/p>\n<p><code><strong>private&nbsp;float<\/strong>[]&nbsp;mDeltas;<\/code><\/p>\n<p><code><strong>private&nbsp;float&nbsp;<\/strong>mTheta;<\/code><\/p>\n<p><code><strong>private&nbsp;int&nbsp;<\/strong>mN;<\/code><\/p>\n<p><code><strong>private&nbsp;<\/strong>Shape&nbsp;mClipShape;<\/code><\/p>\n<p><code><strong>public&nbsp;<\/strong>Bouncer()&nbsp;{<\/code><br \/>\n<code>previousTimes&nbsp;=&nbsp;<strong>new&nbsp;long<\/strong>[128];<\/code><br \/>\n<code>previousTimes[0]&nbsp;=&nbsp;System.currentTimeMillis();<\/code><br \/>\n<code>previousIndex&nbsp;=&nbsp;1;<\/code><br \/>\n<code>previousFilled&nbsp;=&nbsp;<strong>false<\/strong>;<\/code><\/p>\n<p><code>mN&nbsp;=&nbsp;38;<\/code><br \/>\n<code>mPoints&nbsp;=&nbsp;<strong>new&nbsp;float<\/strong>[mN];<\/code><br \/>\n<code>mDeltas&nbsp;=&nbsp;<strong>new&nbsp;float<\/strong>[mN];<\/code><br \/>\n<code>Random&nbsp;random&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>Random();<\/code><br \/>\n<code><strong>for&nbsp;<\/strong>(<strong>int&nbsp;<\/strong>i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;mN;&nbsp;i++)&nbsp;{<\/code><br \/>\n<code>mPoints[i]&nbsp;=&nbsp;random.nextFloat()&nbsp;*&nbsp;500;<\/code><br \/>\n<code>mDeltas[i]&nbsp;=&nbsp;random.nextFloat()&nbsp;*&nbsp;3;<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>addComponentListener(<strong>new&nbsp;<\/strong>ComponentAdapter()&nbsp;{<\/code><br \/>\n<code><strong>public&nbsp;void&nbsp;<\/strong>componentResized(ComponentEvent&nbsp;ce)&nbsp;{<\/code><br \/>\n<code>Dimension&nbsp;d&nbsp;=&nbsp;getSize();<\/code><br \/>\n<code><strong>for&nbsp;<\/strong>(<strong>int&nbsp;<\/strong>i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;mN;&nbsp;i++)&nbsp;{<\/code><br \/>\n<code><strong>int&nbsp;<\/strong>limit&nbsp;=&nbsp;((i&nbsp;%&nbsp;2)&nbsp;==&nbsp;0)&nbsp;?&nbsp;d.width&nbsp;:&nbsp;d.height;<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(mPoints[i]&nbsp;&lt;&nbsp;0)<\/code><br \/>\n<code>mPoints[i]&nbsp;=&nbsp;0;<\/code><br \/>\n<code><strong>else&nbsp;if&nbsp;<\/strong>(mPoints[i]&nbsp;&gt;=&nbsp;limit)<\/code><br \/>\n<code>mPoints[i]&nbsp;=&nbsp;limit&nbsp;-&nbsp;1;<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><br \/>\n<code>});<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>public&nbsp;void&nbsp;<\/strong>setSwitch(<strong>int&nbsp;<\/strong>item,&nbsp;<strong>boolean&nbsp;<\/strong>value)&nbsp;{<\/code><br \/>\n<code><strong>switch&nbsp;<\/strong>(item)&nbsp;{<\/code><br \/>\n<code><strong>case&nbsp;<\/strong>ANTIALIASING:<\/code><br \/>\n<code>mAntialiasing&nbsp;=&nbsp;value;<\/code><br \/>\n<code><strong>break<\/strong>;<\/code><br \/>\n<code><strong>case&nbsp;<\/strong>GRADIENT:<\/code><br \/>\n<code>mGradient&nbsp;=&nbsp;value;<\/code><br \/>\n<code><strong>break<\/strong>;<\/code><br \/>\n<code><strong>case&nbsp;<\/strong>OUTLINE:<\/code><br \/>\n<code>mOutline&nbsp;=&nbsp;value;<\/code><br \/>\n<code><strong>break<\/strong>;<\/code><br \/>\n<code><strong>case&nbsp;<\/strong>TRANSFORM:<\/code><br \/>\n<code>mTransform&nbsp;=&nbsp;value;<\/code><br \/>\n<code><strong>break<\/strong>;<\/code><br \/>\n<code><strong>case&nbsp;<\/strong>DOTTED:<\/code><br \/>\n<code>mDotted&nbsp;=&nbsp;value;<\/code><br \/>\n<code><strong>break<\/strong>;<\/code><br \/>\n<code><strong>case&nbsp;<\/strong>AXES:<\/code><br \/>\n<code>mAxes&nbsp;=&nbsp;value;<\/code><br \/>\n<code><strong>break<\/strong>;<\/code><br \/>\n<code><strong>case&nbsp;<\/strong>CLIP:<\/code><br \/>\n<code>mClip&nbsp;=&nbsp;value;<\/code><br \/>\n<code><strong>break<\/strong>;<\/code><br \/>\n<code><strong>default<\/strong>:<\/code><br \/>\n<code><strong>break<\/strong>;<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;<\/strong>Checkbox&nbsp;createCheckbox(String&nbsp;label,&nbsp;<strong>final&nbsp;int&nbsp;<\/strong>item)&nbsp;{<\/code><br \/>\n<code>Checkbox&nbsp;check&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>Checkbox(label);<\/code><br \/>\n<code>check.addItemListener(<strong>new&nbsp;<\/strong>ItemListener()&nbsp;{<\/code><br \/>\n<code><strong>public&nbsp;void&nbsp;<\/strong>itemStateChanged(ItemEvent&nbsp;ie)&nbsp;{<\/code><br \/>\n<code>setSwitch(item,&nbsp;(ie.getStateChange()&nbsp;==&nbsp;ie.SELECTED));<\/code><br \/>\n<code>}<\/code><br \/>\n<code>});<\/code><br \/>\n<code><strong>return&nbsp;<\/strong>check;<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>public&nbsp;void&nbsp;<\/strong>timeStep()&nbsp;{<\/code><br \/>\n<code>Dimension&nbsp;d&nbsp;=&nbsp;getSize();<\/code><br \/>\n<code><strong>for&nbsp;<\/strong>(<strong>int&nbsp;<\/strong>i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;mN;&nbsp;i++)&nbsp;{<\/code><br \/>\n<code><strong>float&nbsp;<\/strong>value&nbsp;=&nbsp;mPoints[i]&nbsp;+&nbsp;mDeltas[i];<\/code><br \/>\n<code><strong>int&nbsp;<\/strong>limit&nbsp;=&nbsp;((i&nbsp;%&nbsp;2)&nbsp;==&nbsp;0)&nbsp;?&nbsp;d.width&nbsp;:&nbsp;d.height;<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(value&nbsp;&lt;&nbsp;0&nbsp;||&nbsp;value&nbsp;&gt;&nbsp;limit)&nbsp;{<\/code><br \/>\n<code>mDeltas[i]&nbsp;=&nbsp;-mDeltas[i];<\/code><br \/>\n<code>mPoints[i]&nbsp;+=&nbsp;mDeltas[i];<\/code><br \/>\n<code>}&nbsp;<strong>else<\/strong><\/code><br \/>\n<code>mPoints[i]&nbsp;=&nbsp;value;<\/code><br \/>\n<code>}<\/code><br \/>\n<code>mTheta&nbsp;+=&nbsp;Math.PI&nbsp;\/&nbsp;192;<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(mTheta&nbsp;&gt;&nbsp;(2&nbsp;*&nbsp;Math.PI))<\/code><br \/>\n<code>mTheta&nbsp;-=&nbsp;(2&nbsp;*&nbsp;Math.PI);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>public&nbsp;void&nbsp;<\/strong>paint(Graphics&nbsp;g)&nbsp;{<\/code><br \/>\n<code>Graphics2D&nbsp;g2&nbsp;=&nbsp;(Graphics2D)&nbsp;g;<\/code><br \/>\n<code>setAntialiasing(g2);<\/code><br \/>\n<code>setClip(g2);<\/code><br \/>\n<code>setTransform(g2);<\/code><br \/>\n<code>Shape&nbsp;shape&nbsp;=&nbsp;createShape();<\/code><br \/>\n<code>setPaint(g2);<\/code><\/p>\n<p><code>g2.fill(shape);<\/code><\/p>\n<p><code><strong>if&nbsp;<\/strong>(mOutline)&nbsp;{<\/code><br \/>\n<code>setStroke(g2);<\/code><br \/>\n<code>g2.setPaint(Color.blue);<\/code><br \/>\n<code>g2.draw(shape);<\/code><br \/>\n<code>}<\/code><br \/>\n<code>drawAxes(g2);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;void&nbsp;<\/strong>setAntialiasing(Graphics2D&nbsp;g2)&nbsp;{<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(mAntialiasing&nbsp;==&nbsp;<strong>false<\/strong>)<\/code><br \/>\n<code><strong>return<\/strong>;<\/code><br \/>\n<code>g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,<\/code><br \/>\n<code>RenderingHints.VALUE_ANTIALIAS_ON);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;void&nbsp;<\/strong>setClip(Graphics2D&nbsp;g2)&nbsp;{<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(mClip&nbsp;==&nbsp;<strong>false<\/strong>)<\/code><br \/>\n<code><strong>return<\/strong>;<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(mClipShape&nbsp;==&nbsp;<strong>null<\/strong>)&nbsp;{<\/code><br \/>\n<code>Dimension&nbsp;d&nbsp;=&nbsp;getSize();<\/code><br \/>\n<code>FontRenderContext&nbsp;frc&nbsp;=&nbsp;g2.getFontRenderContext();<\/code><br \/>\n<code>Font&nbsp;font&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>Font(\"Serif\",&nbsp;Font.PLAIN,&nbsp;144);<\/code><br \/>\n<code>String&nbsp;s&nbsp;=&nbsp;\"Java&nbsp;Source&nbsp;and&nbsp;Support!\";<\/code><br \/>\n<code>GlyphVector&nbsp;gv&nbsp;=&nbsp;font.createGlyphVector(frc,&nbsp;s);<\/code><br \/>\n<code>Rectangle2D&nbsp;bounds&nbsp;=&nbsp;font.getStringBounds(s,&nbsp;frc);<\/code><br \/>\n<code>mClipShape&nbsp;=&nbsp;gv.getOutline(<\/code><br \/>\n<code>(d.width&nbsp;-&nbsp;(<strong>float<\/strong>)&nbsp;bounds.getWidth())&nbsp;\/&nbsp;2,<\/code><br \/>\n<code>(d.height&nbsp;+&nbsp;(<strong>float<\/strong>)&nbsp;bounds.getHeight())&nbsp;\/&nbsp;2);<\/code><br \/>\n<code>}<\/code><br \/>\n<code>g2.clip(mClipShape);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;void&nbsp;<\/strong>setTransform(Graphics2D&nbsp;g2)&nbsp;{<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(mTransform&nbsp;==&nbsp;<strong>false<\/strong>)<\/code><br \/>\n<code><strong>return<\/strong>;<\/code><br \/>\n<code>Dimension&nbsp;d&nbsp;=&nbsp;getSize();<\/code><br \/>\n<code>g2.rotate(mTheta,&nbsp;d.width&nbsp;\/&nbsp;2,&nbsp;d.height&nbsp;\/&nbsp;2);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;<\/strong>Shape&nbsp;createShape()&nbsp;{<\/code><br \/>\n<code>GeneralPath&nbsp;path&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>GeneralPath(GeneralPath.WIND_EVEN_ODD,<\/code><br \/>\n<code>mPoints.length);<\/code><br \/>\n<code>path.moveTo(mPoints[0],&nbsp;mPoints[1]);<\/code><br \/>\n<code><strong>for&nbsp;<\/strong>(<strong>int&nbsp;<\/strong>i&nbsp;=&nbsp;2;&nbsp;i&nbsp;&lt;&nbsp;mN;&nbsp;i&nbsp;+=&nbsp;6)<\/code><br \/>\n<code>path.curveTo(mPoints[i],&nbsp;mPoints[i&nbsp;+&nbsp;1],&nbsp;mPoints[i&nbsp;+&nbsp;2],<\/code><br \/>\n<code>mPoints[i&nbsp;+&nbsp;3],&nbsp;mPoints[i&nbsp;+&nbsp;4],&nbsp;mPoints[i&nbsp;+&nbsp;5]);<\/code><br \/>\n<code>path.closePath();<\/code><br \/>\n<code><strong>return&nbsp;<\/strong>path;<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;void&nbsp;<\/strong>setPaint(Graphics2D&nbsp;g2)&nbsp;{<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(mGradient)&nbsp;{<\/code><br \/>\n<code>GradientPaint&nbsp;gp&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>GradientPaint(0,&nbsp;0,&nbsp;Color.yellow,&nbsp;50,&nbsp;25,<\/code><br \/>\n<code>Color.red,&nbsp;<strong>true<\/strong>);<\/code><br \/>\n<code>g2.setPaint(gp);<\/code><br \/>\n<code>}&nbsp;<strong>else<\/strong><\/code><br \/>\n<code>g2.setPaint(Color.orange);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;void&nbsp;<\/strong>setStroke(Graphics2D&nbsp;g2)&nbsp;{<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(mDotted&nbsp;==&nbsp;<strong>false<\/strong>)<\/code><br \/>\n<code><strong>return<\/strong>;<\/code><\/p>\n<p><code>Stroke&nbsp;stroke&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>BasicStroke(1,&nbsp;BasicStroke.CAP_BUTT,<\/code><br \/>\n<code>BasicStroke.JOIN_ROUND,&nbsp;10,&nbsp;<strong>new&nbsp;float<\/strong>[]&nbsp;{&nbsp;4,&nbsp;4&nbsp;},&nbsp;0);<\/code><br \/>\n<code>g2.setStroke(stroke);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;void&nbsp;<\/strong>drawAxes(Graphics2D&nbsp;g2)&nbsp;{<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(mAxes&nbsp;==&nbsp;<strong>false<\/strong>)<\/code><br \/>\n<code><strong>return<\/strong>;<\/code><br \/>\n<code>g2.setPaint(getForeground());<\/code><br \/>\n<code>g2.setStroke(<strong>new&nbsp;<\/strong>BasicStroke());<\/code><br \/>\n<code>Dimension&nbsp;d&nbsp;=&nbsp;getSize();<\/code><br \/>\n<code><strong>int&nbsp;<\/strong>side&nbsp;=&nbsp;20;<\/code><br \/>\n<code><strong>int&nbsp;<\/strong>arrow&nbsp;=&nbsp;4;<\/code><br \/>\n<code><strong>int&nbsp;<\/strong>w&nbsp;=&nbsp;d.width&nbsp;\/&nbsp;2,&nbsp;h&nbsp;=&nbsp;d.height&nbsp;\/&nbsp;2;<\/code><br \/>\n<code>g2.drawLine(w&nbsp;-&nbsp;side,&nbsp;h,&nbsp;w&nbsp;+&nbsp;side,&nbsp;h);<\/code><br \/>\n<code>g2.drawLine(w&nbsp;+&nbsp;side&nbsp;-&nbsp;arrow,&nbsp;h&nbsp;-&nbsp;arrow,&nbsp;w&nbsp;+&nbsp;side,&nbsp;h);<\/code><br \/>\n<code>g2.drawLine(w,&nbsp;h&nbsp;-&nbsp;side,&nbsp;w,&nbsp;h&nbsp;+&nbsp;side);<\/code><br \/>\n<code>g2.drawLine(w&nbsp;+&nbsp;arrow,&nbsp;h&nbsp;+&nbsp;side&nbsp;-&nbsp;arrow,&nbsp;w,&nbsp;h&nbsp;+&nbsp;side);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>public&nbsp;void&nbsp;<\/strong>run()&nbsp;{<\/code><br \/>\n<code><strong>while&nbsp;<\/strong>(trucking)&nbsp;{<\/code><br \/>\n<code>render();<\/code><br \/>\n<code>timeStep();<\/code><br \/>\n<code>calculateFrameRate();<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;void&nbsp;<\/strong>render()&nbsp;{<\/code><br \/>\n<code>Graphics&nbsp;g&nbsp;=&nbsp;getGraphics();<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(g&nbsp;!=&nbsp;<strong>null<\/strong>)&nbsp;{<\/code><br \/>\n<code>Dimension&nbsp;d&nbsp;=&nbsp;getSize();<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(checkImage(d))&nbsp;{<\/code><br \/>\n<code>Graphics&nbsp;imageGraphics&nbsp;=&nbsp;image.getGraphics();<\/code><\/p>\n<p><code>imageGraphics.setColor(getBackground());<\/code><br \/>\n<code>imageGraphics.fillRect(0,&nbsp;0,&nbsp;d.width,&nbsp;d.height);<\/code><br \/>\n<code>imageGraphics.setColor(getForeground());<\/code><\/p>\n<p><code>paint(imageGraphics);<\/code><\/p>\n<p><code>g.drawImage(image,&nbsp;0,&nbsp;0,&nbsp;<strong>null<\/strong>);<\/code><\/p>\n<p><code>imageGraphics.dispose();<\/code><br \/>\n<code>}<\/code><br \/>\n<code>g.dispose();<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>\/\/&nbsp;Offscreen&nbsp;image.<\/code><br \/>\n<code><strong>protected&nbsp;boolean&nbsp;<\/strong>checkImage(Dimension&nbsp;d)&nbsp;{<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(d.width&nbsp;==&nbsp;0&nbsp;||&nbsp;d.height&nbsp;==&nbsp;0)<\/code><br \/>\n<code><strong>return&nbsp;false<\/strong>;<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(image&nbsp;==&nbsp;<strong>null&nbsp;<\/strong>||&nbsp;image.getWidth(<strong>null<\/strong>)&nbsp;!=&nbsp;d.width<\/code><br \/>\n<code>||&nbsp;image.getHeight(<strong>null<\/strong>)&nbsp;!=&nbsp;d.height)&nbsp;{<\/code><br \/>\n<code>image&nbsp;=&nbsp;createImage(d.width,&nbsp;d.height);<\/code><br \/>\n<code>}<\/code><br \/>\n<code><strong>return&nbsp;true<\/strong>;<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>protected&nbsp;void&nbsp;<\/strong>calculateFrameRate()&nbsp;{<\/code><br \/>\n<code>\/\/&nbsp;Measure&nbsp;the&nbsp;frame&nbsp;rate<\/code><br \/>\n<code><strong>long&nbsp;<\/strong>now&nbsp;=&nbsp;System.currentTimeMillis();<\/code><br \/>\n<code><strong>int&nbsp;<\/strong>numberOfFrames&nbsp;=&nbsp;previousTimes.length;<\/code><br \/>\n<code><strong>double&nbsp;<\/strong>newRate;<\/code><br \/>\n<code>\/\/&nbsp;Use&nbsp;the&nbsp;more&nbsp;stable&nbsp;method&nbsp;if&nbsp;a&nbsp;history&nbsp;is&nbsp;available.<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(previousFilled)<\/code><br \/>\n<code>newRate&nbsp;=&nbsp;(<strong>double<\/strong>)&nbsp;numberOfFrames<\/code><br \/>\n<code>\/&nbsp;(<strong>double<\/strong>)&nbsp;(now&nbsp;-&nbsp;previousTimes[previousIndex])&nbsp;*&nbsp;1000.0;<\/code><br \/>\n<code><strong>else<\/strong><\/code><br \/>\n<code>newRate&nbsp;=&nbsp;1000.0&nbsp;\/&nbsp;(<strong>double<\/strong>)&nbsp;(now&nbsp;-&nbsp;previousTimes[numberOfFrames&nbsp;-&nbsp;1]);<\/code><br \/>\n<code>firePropertyChange(\"frameRate\",&nbsp;frameRate,&nbsp;newRate);<\/code><br \/>\n<code>frameRate&nbsp;=&nbsp;newRate;<\/code><br \/>\n<code>\/\/&nbsp;Update&nbsp;the&nbsp;history.<\/code><br \/>\n<code>previousTimes[previousIndex]&nbsp;=&nbsp;now;<\/code><br \/>\n<code>previousIndex++;<\/code><br \/>\n<code><strong>if&nbsp;<\/strong>(previousIndex&nbsp;&gt;=&nbsp;numberOfFrames)&nbsp;{<\/code><br \/>\n<code>previousIndex&nbsp;=&nbsp;0;<\/code><br \/>\n<code>previousFilled&nbsp;=&nbsp;<strong>true<\/strong>;<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>public&nbsp;double&nbsp;<\/strong>getFrameRate()&nbsp;{<\/code><br \/>\n<code><strong>return&nbsp;<\/strong>frameRate;<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>\/\/&nbsp;Property&nbsp;change&nbsp;support.<\/code><br \/>\n<code><strong>private&nbsp;transient&nbsp;<\/strong>AnimationFrame&nbsp;mRateListener;<\/code><\/p>\n<p><code><strong>public&nbsp;void&nbsp;<\/strong>setRateListener(AnimationFrame&nbsp;af)&nbsp;{<\/code><br \/>\n<code>mRateListener&nbsp;=&nbsp;af;<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>public&nbsp;void&nbsp;<\/strong>firePropertyChange(String&nbsp;name,&nbsp;<strong>double&nbsp;<\/strong>oldValue,&nbsp;<strong>double&nbsp;<\/strong>newValue)&nbsp;{<\/code><br \/>\n<code>mRateListener.rateChanged(newValue);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>}<\/code><\/p>\n<p><code><strong>class&nbsp;<\/strong>AnimationFrame&nbsp;<strong>extends&nbsp;<\/strong>JFrame&nbsp;{<\/code><br \/>\n<code><strong>private&nbsp;<\/strong>Label&nbsp;mStatusLabel;<\/code><\/p>\n<p><code><strong>private&nbsp;<\/strong>NumberFormat&nbsp;mFormat;<\/code><\/p>\n<p><code><strong>public&nbsp;<\/strong>AnimationFrame(Bouncer&nbsp;ac)&nbsp;{<\/code><br \/>\n<code><strong>super<\/strong>();<\/code><br \/>\n<code>setLayout(<strong>new&nbsp;<\/strong>BorderLayout());<\/code><br \/>\n<code>add(ac,&nbsp;BorderLayout.CENTER);<\/code><br \/>\n<code>add(mStatusLabel&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>Label(),&nbsp;BorderLayout.SOUTH);<\/code><br \/>\n<code>\/\/&nbsp;Create&nbsp;a&nbsp;number&nbsp;formatter.<\/code><br \/>\n<code>mFormat&nbsp;=&nbsp;NumberFormat.getInstance();<\/code><br \/>\n<code>mFormat.setMaximumFractionDigits(1);<\/code><br \/>\n<code>\/\/&nbsp;Listen&nbsp;for&nbsp;the&nbsp;frame&nbsp;rate&nbsp;changes.<\/code><br \/>\n<code>ac.setRateListener(<strong>this<\/strong>);<\/code><br \/>\n<code>\/\/&nbsp;Kick&nbsp;off&nbsp;the&nbsp;animation.<\/code><br \/>\n<code>Thread&nbsp;t&nbsp;=&nbsp;<strong>new&nbsp;<\/strong>Thread(ac);<\/code><br \/>\n<code>t.start();<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code><strong>public&nbsp;void&nbsp;<\/strong>rateChanged(<strong>double&nbsp;<\/strong>frameRate)&nbsp;{<\/code><br \/>\n<code>mStatusLabel.setText(mFormat.format(frameRate)&nbsp;+&nbsp;\"&nbsp;fps\");<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>import&nbsp;java.awt.BasicStroke; import&nbsp;java.awt.BorderLayout; import&nbsp;java.awt.Checkbox; import&nbsp;java.awt.Color; import&nbsp;java.awt.Dimension; import&nbsp;java.awt.Font; import&nbsp;java.awt.Frame; import&nbsp;java.awt.GradientPaint; import&nbsp;java.awt.Graphics; import&nbsp;java.awt.Graphics2D; import&nbsp;java.awt.Image; import&nbsp;java.awt.Label; import&nbsp;java.awt.Panel; import&nbsp;java.awt.RenderingHints; import&nbsp;java.awt.Shape; import&nbsp;java.awt.Stroke; import&nbsp;java.awt.event.ComponentAdapter; import&nbsp;java.awt.event.ComponentEvent; import&nbsp;java.awt.event.ItemEvent; import&nbsp;java.awt.event.ItemListener;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_layout":"default_layout","_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"ngg_post_thumbnail":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"Animation: bounce","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[3508,1079],"tags":[249,942,51],"class_list":["post-3611","post","type-post","status-publish","format-standard","hentry","category-programacao","category-tecnologia","tag-informatica","tag-java","tag-programacao"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":3592,"url":"https:\/\/eliezerladeira.com.br\/blog\/noise-image\/","url_meta":{"origin":3611,"position":0},"title":"Noise Image","author":"admin","date":"","format":false,"excerpt":"import\u00a0java.awt.Graphics; import\u00a0java.awt.event.WindowAdapter; import\u00a0java.awt.event.WindowEvent; import\u00a0java.awt.image.BufferedImage; import\u00a0java.awt.image.ColorModel; import\u00a0java.awt.image.DataBuffer; import\u00a0java.awt.image.DataBufferByte; import\u00a0java.awt.image.IndexColorModel; import\u00a0java.awt.image.Raster; import\u00a0java.awt.image.WritableRaster; import\u00a0java.util.Random; import\u00a0javax.swing.JComponent; import\u00a0javax.swing.JFrame; public\u00a0class\u00a0StaticGenerator\u00a0extends\u00a0JComponent\u00a0implements\u00a0Runnable\u00a0{ byte[]\u00a0data; BufferedImage\u00a0image; Random\u00a0random; public\u00a0void\u00a0initialize()\u00a0{ int\u00a0w\u00a0=\u00a0getSize().width,\u00a0h\u00a0=\u00a0getSize().height; int\u00a0length\u00a0=\u00a0((w\u00a0+\u00a07)\u00a0*\u00a0h)\u00a0\/\u00a08; data\u00a0=\u00a0new\u00a0byte[length]; DataBuffer\u00a0db\u00a0=\u00a0new\u00a0DataBufferByte(data,\u00a0length); WritableRaster\u00a0wr\u00a0=\u00a0Raster.createPackedRaster(db,\u00a0w,\u00a0h,\u00a01,\u00a0null); ColorModel\u00a0cm\u00a0=\u00a0new\u00a0IndexColorModel(1,\u00a02,\u00a0new\u00a0byte[]\u00a0{\u00a0(byte)\u00a00,\u00a0(byte)\u00a0255\u00a0},\u00a0new\u00a0byte[]\u00a0{ (byte)\u00a00,\u00a0(byte)\u00a0255\u00a0},\u00a0new\u00a0byte[]\u00a0{\u00a0(byte)\u00a00,\u00a0(byte)\u00a0255\u00a0}); image\u00a0=\u00a0new\u00a0BufferedImage(cm,\u00a0wr,\u00a0false,\u00a0null); random\u00a0=\u00a0new\u00a0Random(); new\u00a0Thread(this).start(); } public\u00a0void\u00a0run()\u00a0{ while\u00a0(true)\u00a0{ random.nextBytes(data); repaint(); try\u00a0{ Thread.sleep(1000\u00a0\/\u00a024); }\u00a0catch\u00a0(InterruptedException\u00a0e)\u00a0{\u00a0\/*\u00a0die\u00a0*\/ } } } public\u00a0void\u00a0paint(Graphics\u00a0g)\u00a0{ if\u00a0(image\u00a0==\u00a0null) initialize(); g.drawImage(image,\u00a00,\u00a00,\u00a0this); } public\u00a0static\u00a0void\u00a0main(String[]\u00a0args)\u00a0{ JFrame\u00a0f\u00a0=\u00a0new\u00a0JFrame(); f.add(new\u00a0StaticGenerator()); f.setSize(300,\u00a0300); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true);\u2026","rel":"","context":"Em &quot;Programa\u00e7\u00e3o&quot;","block_context":{"text":"Programa\u00e7\u00e3o","link":"https:\/\/eliezerladeira.com.br\/blog\/category\/tecnologia\/programacao\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/netsysoft.wordpress.com\/wp-content\/uploads\/2010\/02\/staticgenerator.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":3583,"url":"https:\/\/eliezerladeira.com.br\/blog\/fade-out-de-uma-imagem-a-imagem-vai-ficando-transparente-gradualmente-ate-que-esteja-completamente-invisivel\/","url_meta":{"origin":3611,"position":1},"title":"Fade out de uma imagem: a imagem vai ficando transparente gradualmente at\u00e9 que esteja completamente\u00a0invis\u00edvel","author":"admin","date":"","format":false,"excerpt":"import\u00a0java.awt.AlphaComposite; import\u00a0java.awt.Graphics; import\u00a0java.awt.Graphics2D; import\u00a0java.awt.Image; import\u00a0java.awt.event.ActionEvent; import\u00a0java.awt.event.ActionListener; import\u00a0javax.swing.ImageIcon; import\u00a0javax.swing.JFrame; import\u00a0javax.swing.JPanel; import\u00a0javax.swing.Timer; public\u00a0class\u00a0FadeOutImage\u00a0extends\u00a0JPanel\u00a0implements\u00a0ActionListener\u00a0{ Image\u00a0myImage\u00a0=\u00a0new\u00a0ImageIcon(\"a.jpg\").getImage(); Timer\u00a0timer\u00a0=\u00a0new\u00a0Timer(20,\u00a0this); private\u00a0float\u00a0alpha\u00a0=\u00a01f; public\u00a0FadeOutImage()\u00a0{ timer.start(); } public\u00a0void\u00a0paint(Graphics\u00a0g)\u00a0{ super.paint(g); Graphics2D\u00a0g2d\u00a0=\u00a0(Graphics2D)\u00a0g; g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,\u00a0alpha)); g2d.drawImage(myImage,\u00a010,\u00a010,\u00a0null); } public\u00a0void\u00a0actionPerformed(ActionEvent\u00a0e)\u00a0{ alpha\u00a0+=\u00a0-0.01f; if\u00a0(alpha\u00a0<=\u00a00)\u00a0{ alpha\u00a0=\u00a00; timer.stop(); } repaint(); } public\u00a0static\u00a0void\u00a0main(String[]\u00a0args)\u00a0{ JFrame\u00a0frame\u00a0=\u00a0new\u00a0JFrame(\"Fade\u00a0out\"); frame.add(new\u00a0FadeOutImage()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300,\u00a0250); frame.setVisible(true); } } \u00a0","rel":"","context":"Em &quot;Programa\u00e7\u00e3o&quot;","block_context":{"text":"Programa\u00e7\u00e3o","link":"https:\/\/eliezerladeira.com.br\/blog\/category\/tecnologia\/programacao\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3585,"url":"https:\/\/eliezerladeira.com.br\/blog\/font-size-animation\/","url_meta":{"origin":3611,"position":2},"title":"Font size animation","author":"admin","date":"","format":false,"excerpt":"import\u00a0java.awt.Font; import\u00a0java.awt.FontMetrics; import\u00a0java.awt.Graphics; import\u00a0java.awt.Graphics2D; import\u00a0java.awt.event.ActionEvent; import\u00a0java.awt.event.ActionListener; import\u00a0javax.swing.JFrame; import\u00a0javax.swing.JPanel; import\u00a0javax.swing.Timer; public\u00a0class\u00a0FontSizeAnimation\u00a0extends\u00a0JPanel\u00a0implements\u00a0ActionListener\u00a0{ Timer\u00a0timer; int\u00a0x\u00a0=\u00a01; float\u00a0alpha\u00a0=\u00a01; public\u00a0FontSizeAnimation()\u00a0{ timer\u00a0=\u00a0new\u00a0Timer(8,\u00a0this); timer.setInitialDelay(190); timer.start(); } public\u00a0void\u00a0paint(Graphics\u00a0g)\u00a0{ super.paintComponent(g); Graphics2D\u00a0g2d\u00a0=\u00a0(Graphics2D)\u00a0g; Font\u00a0font\u00a0=\u00a0new\u00a0Font(\"Dialog\",\u00a0Font.PLAIN,\u00a0x); g2d.setFont(font); FontMetrics\u00a0fm\u00a0=\u00a0g2d.getFontMetrics(); String\u00a0s\u00a0=\u00a0\"Java\"; int\u00a0w\u00a0=\u00a0(int)\u00a0getSize().getWidth(); int\u00a0h\u00a0=\u00a0(int)\u00a0getSize().getHeight(); int\u00a0stringWidth\u00a0=\u00a0fm.stringWidth(s); g2d.drawString(s,\u00a0(w\u00a0-\u00a0stringWidth)\u00a0\/\u00a02,\u00a0h\u00a0\/\u00a02); } public\u00a0static\u00a0void\u00a0main(String[]\u00a0args)\u00a0{ JFrame\u00a0frame\u00a0=\u00a0new\u00a0JFrame(\"FontSizeAnimation\"); frame.add(new\u00a0FontSizeAnimation()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400,\u00a0300); frame.setLocationRelativeTo(null); frame.setVisible(true); } public\u00a0void\u00a0actionPerformed(ActionEvent\u00a0e)\u00a0{ x\u00a0+=\u00a01; alpha\u00a0-=\u00a00.0001; repaint(); } } \u00a0","rel":"","context":"Em &quot;Programa\u00e7\u00e3o&quot;","block_context":{"text":"Programa\u00e7\u00e3o","link":"https:\/\/eliezerladeira.com.br\/blog\/category\/tecnologia\/programacao\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3581,"url":"https:\/\/eliezerladeira.com.br\/blog\/a-rotating-and-scaling-rectangle\/","url_meta":{"origin":3611,"position":3},"title":"A rotating and scaling\u00a0rectangle","author":"admin","date":"","format":false,"excerpt":"import\u00a0java.awt.Graphics; import\u00a0java.awt.Graphics2D; import\u00a0java.awt.Rectangle; import\u00a0java.awt.RenderingHints; import\u00a0java.awt.event.ActionEvent; import\u00a0java.awt.event.ActionListener; import\u00a0javax.swing.JFrame; import\u00a0javax.swing.JPanel; import\u00a0javax.swing.Timer; public\u00a0class\u00a0SwingTimerBasedAnimationScaleRotate\u00a0extends\u00a0JPanel\u00a0implements\u00a0ActionListener\u00a0{ Timer\u00a0timer; private\u00a0double\u00a0angle\u00a0=\u00a00; private\u00a0double\u00a0scale\u00a0=\u00a01; private\u00a0double\u00a0delta\u00a0=\u00a00.01; Rectangle.Float\u00a0r\u00a0=\u00a0new\u00a0Rectangle.Float(20,\u00a020,\u00a0200,\u00a0200); public\u00a0SwingTimerBasedAnimationScaleRotate()\u00a0{ timer\u00a0=\u00a0new\u00a0Timer(10,\u00a0this); timer.start(); } public\u00a0void\u00a0paint(Graphics\u00a0g)\u00a0{ int\u00a0h\u00a0=\u00a0getHeight(); int\u00a0w\u00a0=\u00a0getWidth(); Graphics2D\u00a0g2d\u00a0=\u00a0(Graphics2D)\u00a0g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,\u00a0RenderingHints.VALUE_ANTIALIAS_ON); g2d.setRenderingHint(RenderingHints.KEY_RENDERING,\u00a0RenderingHints.VALUE_RENDER_QUALITY); g2d.translate(w\u00a0\/\u00a02,\u00a0h\u00a0\/\u00a02); g2d.rotate(angle); g2d.scale(scale,\u00a0scale); g2d.fill(r); } public\u00a0static\u00a0void\u00a0main(String[]\u00a0args)\u00a0{ JFrame\u00a0frame\u00a0=\u00a0new\u00a0JFrame(\"Moving\u00a0star\"); frame.add(new\u00a0SwingTimerBasedAnimationScaleRotate()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(420,\u00a0250); frame.setLocationRelativeTo(null); frame.setVisible(true); } public\u00a0void\u00a0actionPerformed(ActionEvent\u00a0e)\u00a0{ if\u00a0(scale\u00a0<\u00a00.01)\u00a0{ delta\u00a0=\u00a0-delta; }\u00a0else\u00a0if\u00a0(scale\u00a0>\u00a00.99)\u00a0{ delta\u00a0=\u00a0-delta; } scale\u00a0+=\u00a0delta; angle\u00a0+=\u00a00.01; repaint(); } } \u00a0","rel":"","context":"Em &quot;Programa\u00e7\u00e3o&quot;","block_context":{"text":"Programa\u00e7\u00e3o","link":"https:\/\/eliezerladeira.com.br\/blog\/category\/tecnologia\/programacao\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3579,"url":"https:\/\/eliezerladeira.com.br\/blog\/timer-based-animation\/","url_meta":{"origin":3611,"position":4},"title":"Timer based animation","author":"admin","date":"","format":false,"excerpt":"import\u00a0java.awt.Color; import\u00a0java.awt.Dimension; import\u00a0java.awt.Graphics; import\u00a0java.awt.Graphics2D; import\u00a0java.awt.RenderingHints; import\u00a0java.awt.event.ActionEvent; import\u00a0java.awt.event.ActionListener; import\u00a0java.awt.geom.Ellipse2D; import\u00a0javax.swing.JFrame; import\u00a0javax.swing.JPanel; import\u00a0javax.swing.Timer; public\u00a0class\u00a0TimerBasedAnimation\u00a0extends\u00a0JPanel\u00a0implements\u00a0ActionListener\u00a0{ private\u00a0Ellipse2D.Float\u00a0ellipse\u00a0=\u00a0new\u00a0Ellipse2D.Float(); private\u00a0double\u00a0esize; private\u00a0double\u00a0maxSize\u00a0=\u00a00; private\u00a0boolean\u00a0initialize\u00a0=\u00a0true; Timer\u00a0timer; ActionListener\u00a0updateProBar; public\u00a0TimerBasedAnimation()\u00a0{ setXY(20\u00a0*\u00a0Math.random(),\u00a0200,\u00a0200); timer\u00a0=\u00a0new\u00a0Timer(20,\u00a0this); timer.setInitialDelay(190); timer.start(); } public\u00a0void\u00a0setXY(double\u00a0size,\u00a0int\u00a0w,\u00a0int\u00a0h)\u00a0{ esize\u00a0=\u00a0size; ellipse.setFrame(10,\u00a010,\u00a0size,\u00a0size); } public\u00a0void\u00a0reset(int\u00a0w,\u00a0int\u00a0h)\u00a0{ maxSize\u00a0=\u00a0w\u00a0\/\u00a010; setXY(maxSize\u00a0*\u00a0Math.random(),\u00a0w,\u00a0h); } public\u00a0void\u00a0step(int\u00a0w,\u00a0int\u00a0h)\u00a0{ esize++; if\u00a0(esize\u00a0>\u00a0maxSize)\u00a0{ setXY(1,\u00a0w,\u00a0h); }\u00a0else\u00a0{ ellipse.setFrame(ellipse.getX(),\u00a0ellipse.getY(),\u00a0esize,\u00a0esize); } } public\u00a0void\u00a0render(int\u00a0w,\u00a0int\u00a0h,\u00a0Graphics2D\u00a0g2)\u00a0{ g2.setColor(Color.BLUE); g2.draw(ellipse); } public\u00a0void\u00a0paint(Graphics\u00a0g)\u00a0{ super.paintComponent(g); Graphics2D\u00a0g2\u00a0=\u00a0(Graphics2D)\u00a0g; RenderingHints\u00a0rh\u00a0=\u00a0new\u00a0RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); rh.put(RenderingHints.KEY_RENDERING,\u00a0RenderingHints.VALUE_RENDER_QUALITY);\u2026","rel":"","context":"Em &quot;Programa\u00e7\u00e3o&quot;","block_context":{"text":"Programa\u00e7\u00e3o","link":"https:\/\/eliezerladeira.com.br\/blog\/category\/tecnologia\/programacao\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3577,"url":"https:\/\/eliezerladeira.com.br\/blog\/is-event-dispatcher-thread\/","url_meta":{"origin":3611,"position":5},"title":"Is Event Dispatcher\u00a0Thread","author":"admin","date":"","format":false,"excerpt":"import\u00a0java.awt.Color; import\u00a0java.awt.Component; import\u00a0java.awt.Dimension; import\u00a0java.awt.event.ActionEvent; import\u00a0java.awt.event.ActionListener; import\u00a0java.util.Random; import\u00a0javax.swing.AbstractAction; import\u00a0javax.swing.ButtonGroup; import\u00a0javax.swing.JButton; import\u00a0javax.swing.JFrame; import\u00a0javax.swing.JLabel; import\u00a0javax.swing.JPanel; import\u00a0javax.swing.JRadioButton; import\u00a0javax.swing.JTable; import\u00a0javax.swing.SwingUtilities; import\u00a0javax.swing.table.AbstractTableModel; import\u00a0javax.swing.table.TableCellRenderer; public\u00a0class\u00a0IsEDTExample\u00a0extends\u00a0JPanel\u00a0{ private\u00a0boolean\u00a0keepRunning; private\u00a0static\u00a0int\u00a0RED\u00a0=\u00a00; private\u00a0static\u00a0int\u00a0BLUE\u00a0=\u00a01; private\u00a0static\u00a0int\u00a0GREEN\u00a0=\u00a02; private\u00a0static\u00a0int\u00a0VARIABLE\u00a0=\u00a03; private\u00a0static\u00a0int\u00a0SIZE\u00a0=\u00a03; private\u00a0int\u00a0threadShade; private\u00a0ColorTableModel\u00a0tableModel=\u00a0new\u00a0ColorTableModel(); private\u00a0Thread\u00a0colorShadeThread; public\u00a0IsEDTExample()\u00a0{ JTable\u00a0table\u00a0=\u00a0new\u00a0JTable(tableModel); table.setRowHeight(100); table.setDefaultRenderer(Object.class,\u00a0new\u00a0ColorRenderer()); add(table); add(new\u00a0JLabel(\"Thread\u00a0Color\u00a0Shade:\")); ButtonGroup\u00a0group\u00a0=\u00a0new\u00a0ButtonGroup(); JRadioButton\u00a0redOption\u00a0=\u00a0new\u00a0JRadioButton(\"Red\"); group.add(redOption); redOption.addActionListener(new\u00a0ActionListener()\u00a0{ public\u00a0void\u00a0actionPerformed(ActionEvent\u00a0e)\u00a0{ threadShade\u00a0=\u00a0RED; } }); JRadioButton\u00a0blueOption\u00a0=\u00a0new\u00a0JRadioButton(\"Blue\"); group.add(blueOption); blueOption.addActionListener(new\u00a0ActionListener()\u00a0{ public\u00a0void\u00a0actionPerformed(ActionEvent\u00a0e)\u00a0{ threadShade\u00a0=\u00a0BLUE; } }); JRadioButton\u00a0greenOption\u00a0=\u00a0new\u00a0JRadioButton(\"Green\"); group.add(greenOption);\u2026","rel":"","context":"Em &quot;Programa\u00e7\u00e3o&quot;","block_context":{"text":"Programa\u00e7\u00e3o","link":"https:\/\/eliezerladeira.com.br\/blog\/category\/tecnologia\/programacao\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/posts\/3611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/comments?post=3611"}],"version-history":[{"count":1,"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/posts\/3611\/revisions"}],"predecessor-version":[{"id":3613,"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/posts\/3611\/revisions\/3613"}],"wp:attachment":[{"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/media?parent=3611"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/categories?post=3611"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eliezerladeira.com.br\/blog\/wp-json\/wp\/v2\/tags?post=3611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}