import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Ellipse2D; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class TimerBasedAnimation extends JPanel implements ActionListener{ private Ellipse2D.Float ellipse = new Ellipse2D.Float();//一个精细的椭圆 private double esize; private double maxSize = 0; private boolean initialize = true;//initialize:初始化 Timer timer; ActionListener updateProBar; public TimerBasedAnimation(){ setXY(20*Math.random(),20,20); timer = new Timer(20,this); timer.setInitialDelay(1900);//设置 Timer 的初始延迟 190毫秒 timer.start(); } public void setXY(double size,int w, int h){//设置xy点 esize = size; //将此 Shape 窗体矩形的位置和大小设置为指定的矩形值。 /* x - 指定矩形左上角的 X 坐标 y - 指定矩形左上角的 Y 坐标 w - 指定矩形的宽度 h - 指定矩形的高度 */ ellipse.setFrame(10,10,size,size); } public void reset(int w, int h){//重启方法 maxSize = w; setXY(maxSize*Math.random(),w,h); } public void step(int w,int h){//设置步骤 esize++; if(esize>maxSize){ setXY(1,w,h); }else{ ellipse.setFrame(ellipse.getX(),ellipse.getY(),esize,esize); } } public void render(int w,int h,Graphics2D g2){ g2.setColor(Color.green); g2.draw(ellipse); } public void paint(Graphics g){ super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2.setRenderingHints(rh); Dimension size = getSize(); if(initialize){//假如为真 reset(size.width,size.height); initialize = false; } this.step(size.width, size.height); render(size.width, size.height, g2); } public void actionPerformed(ActionEvent e) { repaint(); } public static void main(String[] args) { JFrame frame = new JFrame("TimerBasedAnimation"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new TimerBasedAnimation()); frame.setSize(350, 250); frame.setLocationRelativeTo(null); frame.setVisible(true); } }